后端数据操作组合:Pydantic与ORM

2 阅读1分钟
  • ORM(如 SQLAlchemy、Django ORM):负责数据库交互(存、取、改数据),返回的是数据库模型对象
  • Pydantic:负责数据校验 + 格式转换,把 ORM 数据库对象转换成安全、规范的 JSON 数据(给接口用)

Pydantic 专门为 ORM 做了ORM 模式,完美解决「数据库对象 → API 响应数据」的痛点。

介绍Pydantic

Python 最流行的数据验证库,FastAPI 内置依赖。
核心能力:

  • 自动校验数据类型(字符串 / 数字 / 日期等)
  • 自动把非字典对象(ORM 对象)转成字典 / JSON
  • 定义接口入参、出参格式
总结:

支持对前端传入的请求数据进行类型校验、格式校验与规则约束;同时兼容 ORM 模型实体,可自动映射提取对应属性,快速序列化为字典或 JSON 结构用于接口响应返回

最简示例(SQLAlchemy + Pydantic)

1. 定义 ORM 数据库模型(存数据)

from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

# 数据库表模型:对应 user 表
class UserDB(Base):
    __tablename__ = "users"
    id = Column(Integer, primary_key=True, index=True)
    name = Column(String, index=True)
    email = Column(String, unique=True, index=True)
    password = Column(String)  # 敏感字段,接口不返回

2. 定义 Pydantic 模型(返回数据)

from pydantic import BaseModel, EmailStr

# Pydantic 模型:定义接口返回格式
class UserResponse(BaseModel):
    id: int
    name: str
    email: EmailStr  # 自动校验邮箱格式

    # 🔥 关键配置:开启 ORM 模式
    class Config:
        from_attributes = True

3. 直接把 ORM 对象转 Pydantic 对象

# 模拟从数据库查出的 ORM 对象
user_orm = UserDB(id=1, name="张三", email="zhangsan@test.com", password="123456")

# ✅ ORM 对象 → Pydantic 模型(自动过滤 password)
user_pydantic = UserResponse.from_orm(user_orm)

# 转 JSON 给接口
print(user_pydantic.model_dump_json())

输出结果(自动剔除敏感字段、校验格式):

{"id":1,"name":"张三","email":"zhangsan@test.com"}