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()
相关推荐
AIFQuant1 小时前
ETF行情API接入踩坑记:从报错到跑通的七个问题
python·金融·区块链·etf·基金
GPU实战笔记2 小时前
云端 Python 开发:JupyterLab 还是 VS Code Remote-SSH?
python·vs code·jupyterlab·remote-ssh·远程开发
狗狗狗狗狗乐啊3 小时前
搭一个 AI 对话工作台 AChat:从 0 到可用的完整记录(一)
python·react.js·ai编程
白猫不黑3 小时前
Python实现简易Web弱口令爆破与防护方案
python·web安全·计算机·网络安全·黑客·信息安全·渗透测试
kuuailetianzi4 小时前
Python初识:定位、优势与发展历程
python
guoran_shini4 小时前
LLM微调-训练垂类问答模型
python·lora·sft
basketball6164 小时前
Python FastAPI 介绍以及常用方法
python·fastapi·vllm·ai infra
论文复现现场4 小时前
企业知识库 RAG 用什么模型便宜?GLM-5.3-Flash 长文本 API 实测
python·rag·企业知识库·大模型api·glm-5.3-flash
梦在远山后5 小时前
从手写 Loop 到可恢复 Runtime:用 LangGraph、PostgreSQL Checkpoint 与 AG-UI 跑通中断恢复
python·langchain·agent
Yolanda_20225 小时前
8.tensorboard的使用
python