FastAPI/SQLModel查询结果转Polars DataFrame的最优方法及相关疑问
FastAPI/SQLModel查询结果转Polars DataFrame的最优方法及相关疑问
你好呀!你现在用的把SQLModel查询结果转成字典列表再生成Polars DataFrame的方法是完全可行的,但确实不需要先转成JSON/字典列表,Polars提供了更直接、高效的方式来处理这类场景,下面咱们一步步说清楚:
一、优化现有方案:用生成器替代字典列表(省内存)
你当前的代码是先把所有ORM实例转成字典存入列表,其实可以改成用生成器表达式,这样不需要一次性把所有字典加载到内存里,数据量大的时候会更友好:
with Session(engine) as session: questions = session.exec(select(Questions)) # 用生成器表达式边迭代边生成数据,避免内存占用过高 df = pl.DataFrame(q.dict() for q in questions)
或者直接用Polars的pl.from_dicts()接收这个生成器,效果是一样的:
df = pl.from_dicts(q.dict() for q in questions)
二、更高效的方案:直接从数据库读取到Polars DataFrame
如果你的查询不需要依赖ORM实例的额外业务逻辑(比如关联数据的懒加载、自定义属性计算),那直接用Polars的read_sql()方法会是最优解——完全跳过ORM实例化的步骤,直接从数据库拿到数据生成DataFrame,性能提升很明显:
方式1:传入SQLAlchemy的Select语句和Engine
import polars as pl from sqlmodel import Session, select, create_engine, Questions engine = create_engine("postgresql://user:pass@host:port/dbname") # 直接让Polars处理SQLAlchemy的查询语句 df = pl.read_sql(select(Questions), engine)
方式2:执行原生SQL语句
如果你更习惯写原生SQL,也可以直接传入SQL字符串:
df = pl.read_sql("SELECT * FROM questions", engine)
三、核心疑问解答:必须转JSON吗?
当然不需要!转JSON/字典列表是一种通用的兼容方案,但绝非必须。具体选哪种方式,看你的实际场景:
- 如果你需要用到ORM实例的自定义处理逻辑(比如
dict()方法里的字段过滤、已加载的关联数据),那转字典列表是稳妥的选择; - 如果只是单纯读取数据库表数据,不需要ORM的额外逻辑,直接用
pl.read_sql()是最省心、高效的方式,代码更简洁,速度也更快。
内容来源于stack exchange
相关产品推荐
相关产品推荐

