如何用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
相关产品推荐
相关产品推荐

