如何用datamodel-code-generator生成带Table标识的SQLModel?
一、用datamodel-code-generator直接适配
datamodel-code-generator本身没有原生支持生成table=True的SQLModel,但可以通过以下两种方式实现:
自定义模板修改生成逻辑
工具支持通过--template-dir指定自定义模板覆盖默认规则。你可以复制官方的Pydantic模板文件,修改类定义部分,让需要作为数据库表的模型生成SQLModel, table=True的结构:- 找到工具安装目录下的
templates/pydantic模板文件夹,复制相关文件到本地自定义目录 - 修改模板中的类生成代码,比如把原来的
改成针对特定模型生成:class {{ class_name }}({{ base_model }}):class {{ class_name }}(SQLModel, table=True): - 生成时执行命令:
datamodel-codegen --input openapi.yaml --output models.py --base-model sqlmodel.SQLModel --template-dir ./your-custom-templates
- 找到工具安装目录下的
结合OpenAPI扩展标记表模型
在你的OpenAPI规范里,给需要作为数据库表的Schema加个自定义扩展(比如x-is-table: true),然后修改模板时读取这个扩展字段,动态判断是否添加table=True。这样能精准控制哪些模型生成带表标识的SQLModel,避免全量修改。
二、替代方案
如果自定义模板太繁琐,试试这些更简单的方法:
手动修改生成的Pydantic模型
先正常生成Pydantic模型,再把需要作为表的模型手动改成继承SQLModel并加上table=True。比如:
原始生成的Pydantic模型:class Customer(BaseModel): id: int name: str修改后:
class Customer(SQLModel, table=True): id: int = Field(primary_key=True) name: str这种方式适合模型数量不多的场景。
写脚本批量转换Pydantic到SQLModel表
可以写个简单的Python脚本,批量把生成的Pydantic模型转换成带table=True的SQLModel。示例代码:from sqlmodel import SQLModel, Field from pydantic import BaseModel def convert_to_sql_table(pydantic_cls, pk_field="id"): # 复制字段注解和属性 new_cls_attrs = {"__annotations__": pydantic_cls.__annotations__} # 处理主键字段 for field_name, field in pydantic_cls.__fields__.items(): if field_name == pk_field: new_cls_attrs[field_name] = Field(primary_key=True, default=field.default) else: new_cls_attrs[field_name] = field.default # 设置table=True new_cls_attrs["table"] = True # 创建新的SQLModel类 return type(pydantic_cls.__name__, (SQLModel,), new_cls_attrs) # 使用示例:假设生成的模型在generated_models模块里 from generated_models import Customer as PydanticCustomer CustomerTable = convert_to_sql_table(PydanticCustomer)换用支持SQLModel的生成工具
可以试试sqlmodel-codegen(虽然目前主要用于从数据库反向生成,但后续可能支持OpenAPI),或者找openapi-codegen的社区维护分支,部分分支支持直接生成SQLModel。
内容的提问来源于stack exchange,提问作者Siddharth Ram

