SQLModel创建表列顺序异常,如何确保id列排在首位?
如何让SQLModel定义的模型列顺序与PostgreSQL表列顺序一致
问题根源
SQLModel 依赖 SQLAlchemy,旧版本(0.0.7及更早)不会保留模型字段的声明顺序,生成DDL时可能按字段名字典序排列。就算是新版本,特殊字段配置或继承关系也可能导致顺序错乱。
解决步骤
1. 先升级SQLModel
从0.0.8版本开始,SQLModel默认会保留你写模型时的字段顺序。打开终端执行:
pip install --upgrade sqlmodel
2. 按预期顺序编写模型
直接把id主键放在模型的第一个字段位置,示例代码:
from sqlmodel import SQLModel, Field from typing import Optional class MyTable(SQLModel, table=True): id: Optional[int] = Field(default=None, primary_key=True) # 首位声明主键 resource_data: str = Field(default="{}") # 其他字段按你想要的顺序往下写 name: str update_time: Optional[str] = Field(default=None)
3. 极端情况:显式指定列顺序
如果升级后还是不对,那就直接用SQLAlchemy的Column对象在__table_args__里强制定义列顺序(需要导入SQLAlchemy的Column):
from sqlmodel import SQLModel, Field from sqlalchemy import Column, Integer, String from typing import Optional class MyTable(SQLModel, table=True): id: Optional[int] = Field(default=None, primary_key=True) resource_data: str = Field(default="{}") __table_args__ = ( Column("id", Integer, primary_key=True), Column("resource_data", String, default="{}"), # 剩下的列按顺序逐个声明 )
这种方法需要重复写列定义,尽量别用,除非前面的方法都不管用。
4. 重建表(如果表已存在)
要是之前已经创建了表,得先删了再重新生成(生产环境一定要先备份数据!):
from sqlmodel import create_engine, SQLModel # 替换成你的PostgreSQL连接字符串 engine = create_engine("postgresql://your_user:your_password@localhost/your_db") SQLModel.metadata.drop_all(engine) SQLModel.metadata.create_all(engine)
内容的提问来源于stack exchange,提问作者epicwhale
相关产品推荐
相关产品推荐

