如何在Python中为Postgres自动生成UUID?

mim*_*mic 4 python postgresql uuid sqlalchemy

我正在尝试在Postgres db中创建对象。

我正在使用这种方法https://websauna.org/docs/narrative/modelling/models.html#uuid-primary-keys

class Role(Base):
    __tablename__ = 'role'

    # Pass `binary=False` to fallback to CHAR instead of BINARY
    id = sa.Column(UUIDType(binary=False), primary_key=True)
Run Code Online (Sandbox Code Playgroud)

但是当我创建对象时

user_role = Role(name='User')
db.session.add(user_role)
db.session.commit()
Run Code Online (Sandbox Code Playgroud)

我有以下错误:

sqlalchemy.exc.IntegrityError: (psycopg2.IntegrityError) null value in column "id" violates not-null constraint
Run Code Online (Sandbox Code Playgroud)

好像我没有提供任何ID。因此,如何使数据库自动生成或自行生成?

Sch*_*ern 7

您似乎正在使用此代码。它缺少该列的默认值。您正在模拟此SQL:

id UUID PRIMARY KEY DEFAULT uuid_generate_v4()
Run Code Online (Sandbox Code Playgroud)

但是您已经链接到正确的代码

id = Column(UUID(as_uuid=True),
    primary_key=True,
    server_default=sqlalchemy.text("uuid_generate_v4()"),)
Run Code Online (Sandbox Code Playgroud)

另外,如果您不想加载Postgres UUID扩展名,则可以在Python中创建UUID。

from uuid import uuid4

id = Column(UUID(as_uuid=True),
    primary_key=True,
    default=uuid4,)
Run Code Online (Sandbox Code Playgroud)

  • 对于 Postgres 13+,我们不再需要使用 `uuid-ossp` 扩展,而是可以使用内置的 `gen_random_uuid()` (3认同)

ben*_*nvc 5

您可以使用该uuid模块并只设置一个列默认值。例如:

from uuid import uuid4
from sqlalchemy import Column, String

class Role(Base):
    __tablename__ = 'role'

    id = Column(String, primary_key=True, default=uuid4)
Run Code Online (Sandbox Code Playgroud)

  • 如果您希望使用 PostgreSQL UUID 类型(我认为它具有一些性能优势),请参阅 @Schwern 的答案。 (2认同)