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

如何用SQLModel让PostgreSQL自动生成UUID字段值

问题分析与解决方案

当前字段定义的问题

你定义的uid字段使用了Python客户端的默认值default=uuid.uuid4(),这会导致UUID由本地Python代码生成后再传入数据库,而非由PostgreSQL服务器自动生成。同时,虽然设置了nullable=False,但如果插入操作绕过Python端的默认值逻辑(比如直接执行原生SQL语句),就会触发数据库的非空约束错误。

修改方案

要让PostgreSQL自动生成UUID,需按以下步骤调整:

  1. 先确保PostgreSQL已安装uuid-ossp扩展(执行以下SQL语句完成安装):
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
  1. 修改uid字段的定义,改用PostgreSQL专属的UUID类型,并设置服务器端默认值:
import uuid
from datetime import datetime, time
from typing import Optional
from uuid import UUID

from sqlmodel import Field, SQLModel, create_engine, Column, DateTime, JSON, text, MetaData

from sqlalchemy.dialects.postgresql import UUID as UUIDSA

class LogsSessionSqlModel(SQLModel, table=True):
    __tablename__ = "foo"
    metadata = foo_metadata

    id: Optional[int] = Field(primary_key=True, index=True)
    description: str = Field(nullable=False, max_length=1024)
    created: Optional[datetime] = Field(sa_column=Column(DateTime(timezone=True), nullable=False))
    uid: UUID = Field(
        sa_column=Column(
            UUIDSA,
            index=True,
            nullable=False,
            server_default=text("uuid_generate_v4()")
        )
    )

修改说明

  • 使用UUIDSA匹配PostgreSQL的原生UUID字段类型
  • 通过server_default=text("uuid_generate_v4()")让PostgreSQL在插入新记录时自动调用内置函数生成UUID
  • 移除Python端的default=uuid.uuid4(),彻底交由数据库生成UUID
  • 将uid类型从Optional[UUID]改为UUID,因为数据库会自动生成值,该字段永远不会为None

内容的提问来源于stack exchange,提问作者RaamEE

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 20:08:10