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

如何用SQLModel与Pydantic create_model指定数据库Schema和表名?

动态创建SQLModel时指定Schema和自定义表名的解决方案

问题描述

已通过字典实现动态创建SQLModel模型及数据库表,但无法显式指定数据库Schema与自定义表名。不想使用默认Schema,且默认生成的表名为全小写形式。静态模型可通过类内定义__tablename__ = "MyTableName"和__table_args__ = {'schema': 'MySchema'}实现,但Pydantic的create_model无直接支持参数,求解决方法。

附现有代码:

from typing import Optional, UUID, date, datetime, bool
from sqlmodel import SQLModel, Field, Column, text, create_engine
from sqlalchemy.types import UNIQUEIDENTIFIER, DATE, DATETIME2, BIT, NVARCHAR

field_definitions = {
    "Id": (Optional[int], Field(default=None, primary_key=True)),
    "Field1": (UUID,  Field(sa_column=Column(UNIQUEIDENTIFIER(), nullable=False, comment=""))),
    "Field2": (date, Field(sa_column=Column(DATE(), nullable=False, server_default=text("GETUTCDATE()"), comment=""))),
    "Field3": (datetime, Field(sa_column=Column(DATETIME2(7), nullable=False, server_default=text("GETUTCDATE()"), comment=""))),
    "Field4": (Optional[datetime], Field(sa_column=Column(DATETIME2(7), nullable=True, comment=""))),
    "Field5" : (bool, Field(sa_column=Column(BIT(), nullable=False, server_default=text("0"), comment=""))),
    "Field6": (str, Field(sa_column=Column(NVARCHAR(1000), nullable=False, comment="")))
}

Table = create_model(
    "TestTable", 
    __base__=SQLModel, 
    __cls_kwargs__={"table": True},
    **field_definitions
)

engine = create_engine("your-database-url")
SQLModel.metadata.create_all(engine)

解决方法

create_model虽无直接传入__tablename__和__table_args__的参数,但可通过动态修改生成模型的类属性实现需求,以下是两种可行方案:

方案一:直接修改模型类属性

调用create_model生成模型后,直接为模型类添加或修改目标属性,操作简单直接:

Table = create_model(
    "TestTable", 
    __base__=SQLModel, 
    __cls_kwargs__={"table": True},
    **field_definitions
)

# 设置自定义表名
Table.__tablename__ = "MyCustomTableName"
# 指定目标Schema
Table.__table_args__ = {'schema': 'MyTargetSchema'}

SQLModel.metadata.create_all(engine)

方案二:自定义基类(批量场景更规范)

若需批量处理多个动态模型,可预先定义带Schema配置的基类,再让动态模型继承该基类:

# 定义包含默认Schema的基类
class BaseSchemaSQLModel(SQLModel):
    __table_args__ = {'schema': 'MyTargetSchema'}

# 创建动态模型时继承自定义基类
Table = create_model(
    "TestTable", 
    __base__=BaseSchemaSQLModel, 
    __cls_kwargs__={"table": True},
    **field_definitions
)
# 单独设置自定义表名
Table.__tablename__ = "MyCustomTableName"

关键注意事项

  • 确保目标Schema已在数据库中创建(如SQL Server、PostgreSQL需手动提前创建),否则create_all执行时会抛出异常。
  • 指定Schema后,后续查询该表时SQLModel会自动带上Schema前缀,无需手动拼接表名。

内容的提问来源于stack exchange,提问作者configure.ng

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 03:59:53