You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不切换至SQLAlchemy的情况下将Flask-SQLAlchemy结果转成Pandas?

Flask-SQLAlchemy 查询结果转 Pandas DataFrame 方案

不需要切换到原生SQLAlchemy,利用Flask-SQLAlchemy本身的封装就能完成高效转换,以下是几种实用方法:

1. 直接用 Pandas 读取查询(推荐高效方案)

Flask-SQLAlchemy的db.engine就是原生SQLAlchemy的引擎实例,可直接传给Pandas的read_sql_query方法,支持两种查询方式:

方式A:原生SQL语句

import pandas as pd
from your_app import db

# 编写原生SQL,用params传递参数避免注入
sql = "SELECT id, name, value FROM your_table WHERE category = %s"
df = pd.read_sql_query(sql, db.engine, params=("electronics",))

方式B:Flask-SQLAlchemy Query 对象

如果已经用ORM构建了查询,直接提取其statement属性即可:

from your_app import db, Product

# 构建ORM查询
query = db.session.query(Product.id, Product.name, Product.price).filter(Product.stock > 0)
# 转换为DataFrame
df = pd.read_sql_query(query.statement, db.engine)

这种方式既保留了ORM的便捷性,又利用了Pandas直接读取数据库的高效性,数据量大时优先选用。

2. 实例列表转字典列表再转 DataFrame

如果已经获取了ORM实例列表(比如query.all()),可以将每个实例转换为字典后生成DataFrame:

results = db.session.query(User).filter(User.registered_at >= "2024-01-01").all()

# 过滤掉SQLAlchemy内部属性_sa_instance_state,转换为纯数据字典
data = [
    {key: value for key, value in item.__dict__.items() if key != "_sa_instance_state"}
    for item in results
]

df = pd.DataFrame(data)

注意:此方法会将所有实例加载到内存,数据量极大时可能占用较多资源,适合小批量数据。

3. 利用 Session.execute 返回的结果集转换

Flask-SQLAlchemy的session.execute返回的Result对象可直接提取行和列名,用Pandas的from_records转换:

from your_app import db, Order

# 执行查询(SQLAlchemy 2.0+风格)
result = db.session.execute(db.select(Order.id, Order.customer_id, Order.total).filter(Order.status == "completed"))

# 提取列名和行数据
columns = result.keys()
rows = result.all()

df = pd.DataFrame.from_records(rows, columns=columns)

内容的提问来源于stack exchange,提问作者Max C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 03:05:09