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

如何在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
        )
    )

错误原因说明

  1. 你最初的写法将default=uuid.uuid4放在了Field参数层,和内层sa_column指定的列配置冲突,导致SQLModel解析字段类型失败,抛出'FieldInfo' object has no attribute 'UUID'错误
  2. 直接给字段赋值Column对象的写法不符合SQLModel的规范,SQLModel要求所有模型字段必须用Field包裹
  3. 未指定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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 01:57:04