如何在不切换至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
相关产品推荐
相关产品推荐

