如何用SQLModel让PostgreSQL自动生成UUID字段值
问题分析与解决方案
当前字段定义的问题
你定义的uid字段使用了Python客户端的默认值default=uuid.uuid4(),这会导致UUID由本地Python代码生成后再传入数据库,而非由PostgreSQL服务器自动生成。同时,虽然设置了nullable=False,但如果插入操作绕过Python端的默认值逻辑(比如直接执行原生SQL语句),就会触发数据库的非空约束错误。
修改方案
要让PostgreSQL自动生成UUID,需按以下步骤调整:
- 先确保PostgreSQL已安装
uuid-ossp扩展(执行以下SQL语句完成安装):
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
- 修改
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
相关产品推荐
相关产品推荐

