Pydantic增强SQLALchemy序列化(FastAPI直接输出SQLALchemy查询集)

Pydantic增强SQLALchemy序列化(FastAPI直接输出SQLALchemy查询集)

1. 前言

在使用SQLAlchemy过程中发现SQLAlchemy的查询集没有类似django-ormvalues()的功能,想通过Pydantic添加个实现类似的功能 还有就是pandas明明支持SQLAlchemy模块,但读取数据的时候还只能通过引擎+SQL语句的模式,实在不够优雅,想着查询集先直接出个字典类数据pandas直接解析

2. 定义SQLALchemy

python 复制代码
from sqlalchemy.orm import declarative_base

# 创建基础模型类
Base = declarative_base()

# 定义一个简单的模型
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    age = Column(Integer)

3. 定义pydantic

python 复制代码
class UserModel(BaseModel):
    id: int = Field(..., description="用户ID")
    name: str = Field(..., description="用户名")
    age: int = Field(..., description="用户年龄")

    model_config = {
        'from_attributes': True
    }

class UserListModel(RootModel):
    root: list[UserModel]
    model_config = {
        'from_attributes': True
    }

4. pydantic序列化SQLALchemy查询集

已经提前添加测试数据

python 复制代码
# 创建数据库引擎
engine = create_engine('sqlite:///test.db')
# 创建表
Base.metadata.create_all(engine)
# 创建会话
Session = sessionmaker(bind=engine)
session = Session()
users = session.query(User).all()
# 将查询结果转换为Pydantic模型
user_list = UserListModel.model_validate(users)
# 转成字典
user_list.model_dump()
# 转成json
user_list.model_dump_json()
# 一步到位的写法
UserListModel.model_validate(users).model_dump_json()

5. 与FatAPI配合

python 复制代码
app = FastAPI()
@app.get("/",response_model=UserListModel)
def read_root():
    with session as db:
        users = db.query(User).all()
        return users

6. 总结

研究完发现这个方法感觉有点多此一举,除了可以用于FastAPI直接输出SQLAlchemy查询集内容外,好像没啥优点了,能更优雅一点?还因为需要定义定义Pydantic反而更复杂一些,建议可以在有Pydantic+Pydantic项目中使用,尤其是FastAPI项目

7. 附录:传统使用方式

常规方式是在模型当中添加一个自定义to_dict()的方法,然后通过列表迭代的方式重新组成查询集字典

python 复制代码
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

# 创建基础模型类
Base = declarative_base()

# 定义一个简单的模型
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    age = Column(Integer)

    def to_dict(self):
        return {
            'id': self.id,
            'name': self.name,
            'age': self.age
        }

# 创建数据库引擎
engine = create_engine('sqlite:///test.db')
# 创建表
Base.metadata.create_all(engine)
# 创建会话
Session = sessionmaker(bind=engine)
session = Session()
# 添加一些示例数据
new_user = User(name='John', age=30)
session.add(new_user)
session.commit()
# 查询数据并转换为字典
users = session.query(User).all()
user_dicts = [user.to_dict() for user in users]
# 打印结果
print(user_dicts)
# 关闭会话
session.close()
相关推荐
SelectDB14 小时前
Apache Doris Python UDF:让 SQL 直接调用 Python 生态,支撑 Agent 时代复杂业务逻辑
大数据·数据库·python
荣码1 天前
GraphRAG:普通RAG只能回答"点"的问题,我踩了4个坑才搞懂
java·python
金銀銅鐵1 天前
[Python] 基于欧几里得算法,实现分数约分计算器
python·数学
Lyn_Li1 天前
Kaggle Top 5 | 198只股票、200条数据的金融预测——BattleFin高分方案从零复现
python·kaggle·比赛复盘·金融预测
小九九的爸爸2 天前
前端想要入门Agent开发,要具备哪些Python基础?
python·agent·ai编程
阿耶同学2 天前
手把手教你用 LangGraph 搭建三层嵌套 Agent 架构
python·程序员
花酒锄作田2 天前
Pydantic校验配置文件
python
hboot2 天前
AI工程师第四课 - 深度学习入门
pytorch·python·神经网络
ZhengEnCi3 天前
P2M-Matplotlib折线图完全指南-从数据可视化到趋势分析的Python绘图利器
python·matlab·数据可视化
ZhengEnCi3 天前
P2L-Matplotlib饼图完全指南-从数据可视化到图表定制的Python绘图利器
python·matlab