使用 sqlalchemy 从 PostgreSQL 查询返回 Pandas 数据帧

2024-04-16

我想查询 PostgreSQL 数据库并将输出作为 Pandas 数据框返回。

我使用“SqlAlchemy”创建了与数据库的连接:

from sqlalchemy import create_engine
engine = create_engine('postgresql://user@localhost:5432/mydb')

我将 Pandas 数据框写入数据库表:

i=pd.read_csv(path)
i.to_sql('Stat_Table',engine,if_exists='replace')

基于docs http://pandas.pydata.org/pandas-docs/version/0.14.0/generated/pandas.read_sql_query.html,看起来 pd.read_sql_query() 应该接受 SQLAlchemy 引擎:

a=pd.read_sql_query('select * from Stat_Table',con=engine)

但它会抛出一个错误:

ProgrammingError: (ProgrammingError) relation "stat_table" does not exist

我正在使用 Pandas 版本 0.14.1。

这样做的正确方法是什么?


您被 PostgreSQL 的大小写敏感问题所困扰。如果您在查询中引用表名,它将起作用:

df = pd.read_sql_query('select * from "Stat_Table"',con=engine)

但就我个人而言,我建议始终使用小写的表名(和列名),在将表写入数据库时​​也是如此,以防止出现此类问题。


来自 PostgreSQL 文档 (http://www.postgresql.org/docs/8.0/static/sql-syntax.html#SQL-SYNTAX-IDENTIFIERS http://www.postgresql.org/docs/8.0/static/sql-syntax.html#SQL-SYNTAX-IDENTIFIERS):

引用标识符也使其区分大小写,而未引用的名称始终折叠为小写

多解释一下:您已经编写了一个名为Stat_Table到数据库(sqlalchemy 会引用这个名称,因此它将在 postgres 数据库中写为“Stat_Table”)。进行查询时'select * from Stat_Table'未加引号的表名将转换为小写stat_table,因此您会收到未找到该表的消息。

另请参见PostgreSQL 列名区分大小写吗? https://stackoverflow.com/questions/20878932/are-postgresql-column-names-case-sensitive

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 sqlalchemy 从 PostgreSQL 查询返回 Pandas 数据帧 的相关文章

随机推荐