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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 03:08:27