【问题标题】:How to convert SQL Query to Pandas DataFrame using SQLAlchemy ORM?如何使用 SQLAlchemy ORM 将 SQL 查询转换为 Pandas DataFrame?
【发布时间】:2023-01-20 02:02:15
【问题描述】:
根据 SQLAlchemy 文档,您应该在执行 SQL 语句时使用 Session 对象。但是在 Pandas .read_sql 中使用 Session 会出现错误:AttributeError 'Session' object has no attribute 'cursor'。
但是,即使使用 ORM 映射类,也可以使用 Connection 对象:
with ENGINE.connect() as conn:
df = pd.read_sql_query(
sqlalchemy.select(MeterValue),
conn
)
MeterValue 是一个映射类。
这感觉不像是正确的解决方案,因为 SQLAlchemy 文档说您不应该将引擎连接与 ORM 一起使用。我只是不知道为什么。
有谁知道使用连接而不是会话与 ORM 映射类是否有任何问题?
使用 SQLAlchemy ORM 将 sql 读入 DataFrame 的正确方法是什么?
我在这个问题上找到了几个旧答案,您可以直接将引擎用作第二个参数,或者使用 session.bind 等等。什么都不管用。
【问题讨论】:
标签:
python
pandas
sqlalchemy
orm
【解决方案1】:
刚刚阅读documentation of pandas.read_sql_query:
pandas.read_sql_query(sql, con, index_col=None, coerce_float=True, params=None, parse_dates=None, chunksize=None, dtype=None)
参数:
-
sql: str SQL query or SQLAlchemy Selectable (select or text object)
要执行的 SQL 查询。
-
con:SQLAlchemy 可连接、str 或 sqlite3 连接
使用 SQLAlchemy 可以使用该库支持的任何数据库。如果是 DBAPI2 对象,则仅支持 sqlite3。
- ...
所以 pandas 确实允许 SQLAlchemy Selectable(例如 select(MeterValue))和 SQLAlchemy 可连接(例如 engine.connect()),因此您的代码块是正确的,pandas 将正确处理查询。
with ENGINE.connect() as conn:
df = pd.read_sql_query(
sqlalchemy.select(MeterValue),
conn,
)