【问题标题】: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,
        )
    

    【讨论】:

      猜你喜欢
      • 2015-10-28
      • 2020-07-29
      • 2015-06-14
      • 1970-01-01
      • 1970-01-01
      • 2019-10-17
      • 1970-01-01
      • 2017-04-25
      • 1970-01-01
      相关资源
      最近更新 更多