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

如何从数据库动态生成Pydantic基础模型与ORM模型?

从现有数据库自动生成FastAPI的ORM模型与Pydantic Schema

一、自动生成SQLAlchemy ORM模型

方法1:用sqlacodegen生成可直接复用的代码文件(推荐)

这是最省心的方式,能直接生成和你手动定义结构一致的ORM代码文件。

  1. 安装工具:
pip install sqlacodegen
  1. 执行生成命令(替换成你的数据库连接字符串):
# PostgreSQL示例
sqlacodegen postgresql://用户名:密码@localhost/数据库名 > models.py

# MySQL示例
sqlacodegen mysql+pymysql://用户名:密码@localhost/数据库名 > models.py

执行后,models.py里会自动包含所有数据库表的ORM模型,比如你的posts表会生成和手动定义完全一致的Post类,包含主键、字段约束、默认值等配置。

方法2:用SQLAlchemy的automap_base运行时动态生成

如果不需要静态代码文件,想在程序运行时直接映射数据库结构:

from sqlalchemy import create_engine
from sqlalchemy.ext.automap import automap_base

# 连接数据库
engine = create_engine("postgresql://用户名:密码@localhost/数据库名")

# 自动映射所有表到ORM模型
Base = automap_base()
Base.prepare(autoload_with=engine)

# 获取posts表对应的ORM模型
Post = Base.classes.posts

生成的Post模型可以直接用于数据库CRUD操作,和手动定义的功能完全一致。

二、自动生成Pydantic Schema(BaseModel)

方法1:用pydantic-sqlalchemy快速转换

借助第三方库直接从ORM模型生成Pydantic Schema:

  1. 安装依赖:
pip install pydantic-sqlalchemy
  1. 生成代码:
from pydantic_sqlalchemy import sqlalchemy_to_pydantic
# 先通过上面的方法得到ORM模型Post

# 生成完整的Pydantic Schema
PostSchema = sqlalchemy_to_pydantic(Post)

# 如果需要创建/更新用的Schema(比如去掉主键id),可以继承修改
class PostCreateSchema(PostSchema):
    class Config:
        exclude = ("id",)

生成的PostSchema会自动匹配数据库字段的类型,比如id是int、postdate会对应datetime类型(如果需要转字符串,可以在Config里添加json_encoders自定义转换)。

方法2:手动通过SQLAlchemy Inspection生成(无需额外库)

不想用第三方库的话,可以通过SQLAlchemy的检查工具获取表结构,动态生成BaseModel:

from typing import Optional
from pydantic import BaseModel
from sqlalchemy import create_engine, inspect, Integer, String, TIMESTAMP

engine = create_engine("postgresql://用户名:密码@localhost/数据库名")
inspector = inspect(engine)
# 获取posts表的字段信息
columns = inspector.get_columns("posts")

# 构建字段类型映射
field_map = {}
for col in columns:
    # 映射数据库类型到Python类型
    if isinstance(col["type"], Integer):
        py_type = int
    elif isinstance(col["type"], String):
        py_type = str
    elif isinstance(col["type"], TIMESTAMP):
        py_type = str  # 可根据需求换成datetime类型
    # 处理非空约束
    if col["nullable"]:
        field_map[col["name"]] = Optional[py_type]
    else:
        field_map[col["name"]] = py_type

# 动态创建Pydantic模型
PostSchema = type("PostSchema", (BaseModel,), field_map)

内容的提问来源于stack exchange,提问作者FrankieDon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 09:07:13