在 PostgreSQL `SELECT *` 进入 Pandas DataFrame 后,列名未显示为 st.dataframe

Column names not displayed with st.dataframe after PostgreSQL `SELECT *` into Pandas DataFrame

Python 3.8.10
streamlit==1.9.0
pandas==1.4.2
psycopg2-binary==2.9.3

使用以下代码将 Postgres table 直接加载到 Pandas DataFrame 中。

df = pd.DataFrame(run_query("SELECT * FROM schema.tablename;"))  

streamlit.dataframe(df) or streamlit.write(df) 显示它会丢失列名。

为了捕获列名,我使用了这个 kluge。

# Initialize connection.
@st.experimental_singleton
def init_connection():
    return psycopg2.connect(**st.secrets["postgresservername"])      
conn = init_connection()

# Perform query.
@st.experimental_memo(ttl=600)
def run_query(query):
    with conn.cursor() as cur:
        cur.execute(query)
        return cur.fetchall()
 
def load_table_as_dataframe(table):
    # This is super klugy. 
    data = run_query("SELECT * FROM schema.{};".format(str(table)))
    columns = run_query("SELECT *FROM information_schema.columns WHERE table_schema = 'schema' AND table_name = '{}';".format(str(table)))
    # Fish out the actual column names
    columns = [c[3] for c in columns]
    df = pd. DataFrame(data, columns = columns)
    return df
 
df = load_table_as_dataframe("tablename") 

哪个有效...

是否有更好的方法将所需数据(和列名称)收集到 Postgres 和 Streamlit 中的 Pandas DataFrame 中?

正在使用...

    df = pd.read_sql("SELECT * FROM schema.{};".format(str(table)), conn)

...解决了问题。 (谢谢@parfait)