如何在FastAPI+SQLAlchemy+SQLModel栈中为PostgreSQL创建UUID字段
解决方案
正确定义写法
你出现报错的核心原因是Field参数和sa_column内部的Column参数冲突,所有自定义列属性需要全部放在sa_column的Column构造参数内,不要拆分到外层Field的参数里。
正确的代码如下:
from datetime import datetime from typing import Optional import uuid from sqlalchemy import Column, DateTime from sqlalchemy.dialects import postgresql as psql from sqlmodel import SQLModel, Field class ModelBase(SQLModel): """ 数据库模型基类 """ id: Optional[int] = Field(default=None, primary_key=True) created_at: datetime = Field(sa_column=Column(DateTime(timezone=True), default=datetime.utcnow)) updated_at: datetime = Field(sa_column=Column(DateTime(timezone=True), onupdate=datetime.utcnow, default=datetime.utcnow)) class UUIDModelBase(ModelBase, table=True): """ 带UUID字段的模型基类 """ uuid: uuid.UUID = Field( sa_column=Column( psql.UUID(as_uuid=True), default=uuid.uuid4, nullable=False, index=True ) )
错误原因说明
- 你最初的写法将
default=uuid.uuid4放在了Field参数层,和内层sa_column指定的列配置冲突,导致SQLModel解析字段类型失败,抛出'FieldInfo' object has no attribute 'UUID'错误 - 直接给字段赋值
Column对象的写法不符合SQLModel的规范,SQLModel要求所有模型字段必须用Field包裹 - 未指定
sa_column或者sa_type声明PostgreSQL原生UUID类型的写法,会导致SQLModel默认将UUID字段映射为字符串类型,和PostgreSQL的UUID类型不匹配触发报错
简化写法(SQLModel 0.0.8及以上版本支持)
如果不想手动写sa_column,可以直接指定sa_type参数:
class UUIDModelBase(ModelBase, table=True): """ 带UUID字段的模型基类 """ uuid: uuid.UUID = Field( default_factory=uuid.uuid4, index=True, nullable=False, sa_type=psql.UUID(as_uuid=True) )
内容的提问来源于stack exchange,提问作者John Kealy
相关产品推荐
相关产品推荐

