如何使用SQLAlchemy将列默认设置为PostgreSQL函数?

Tan*_*rad 16 postgresql uuid sqlalchemy

SQLAlchemy中定义的所有表都有一个类型为UUID的id列.

from sqlalchemy.ext.declarative import declarative_base
from uuid import uuid4
Base = declarative_base()

class MyTable(Base):
    id = Column(UUIDtype, default=uuid4, primary_key=True)
Run Code Online (Sandbox Code Playgroud)

UUIDtypePostgreSQL UUID类型的特殊列类型在哪里.这在PostgreSQL中成功创建了UUID列,但只在使用SQLAlchemy插入时生成默认的UUID值.这对我的一些用例来说很好,但我想在PostgreSQL方面分配列的默认值,以防在SQLAlchemy之外发生插入.

以下SQL命令在列上放置正确的默认值:

ALTER TABLE my_table ALTER COLUMN id SET DEFAULT uuid_generate_v4()
Run Code Online (Sandbox Code Playgroud)

如何uuid_generate_v4()通过SQLAlchemy模型定义将此函数指定为列默认值?如果唯一的选择是通过执行原始SQL语句,有没有办法将该语句的执行挂钩到表创建过程中?

van*_*van 24

您应该使用server_default参数.

id = Column(UUIDtype, server_default=text("uuid_generate_v4()"), primary_key=True)
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅服务器端默认值.

  • 从版本 13 开始,“gen_random_uuid()”现在是 PostgreSQL 本机的一部分,因此不需要模块。https://www.postgresql.org/docs/13/functions-uuid.html (17认同)
  • 使用`create extension uuid-ossp`安装`uuid-ossp`模块 (3认同)
  • 或者使用 `gen_random_uuid()` 而不是 `uuid_generate_v4()` 并使用 `create extension pgcrypto` 安装 `pgcrypto` (3认同)