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

17

我正在尝试在Postgres数据库中创建对象。

我正在使用这种方法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)

但是当我创建对象时

user_role = Role(name='User')
db.session.add(user_role)
db.session.commit()

我遇到了以下错误:

sqlalchemy.exc.IntegrityError: (psycopg2.IntegrityError) null value in column "id" violates not-null constraint

看起来我没有提供任何ID。那么,我该如何让数据库自动生成ID或者自己生成ID呢?


4个回答

31

您似乎正在使用这段代码。该代码中的列缺少默认值。您正在模拟以下SQL:

id UUID PRIMARY KEY DEFAULT uuid_generate_v4()

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

id = Column(UUID(as_uuid=True),
    primary_key=True,
    server_default=sqlalchemy.text("uuid_generate_v4()"),)

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

from uuid import uuid4

id = Column(UUID(as_uuid=True),
    primary_key=True,
    default=uuid4,)

3
在Postgres 13+中,我们不再需要使用uuid-ossp扩展,可以改用内置的gen_random_uuid()函数。 - xlm

5
您可以使用uuid模块并设置列默认值。例如:
from uuid import uuid4
from sqlalchemy import Column, String

class Role(Base):
    __tablename__ = 'role'

    id = Column(String, primary_key=True, default=uuid4)

2
如果您想使用PostgreSQL UUID类型(我认为它具有一些性能优势),请参考@Schwern的答案。 - benvc

3

我实际想说的是:

import uuid

class SomeClass(db.Model):
    __tablename__ = 'someclass'

    id = db.Column(UUID(as_uuid=True),
        primary_key=True, default=lambda: uuid.uuid4().hex)

-3
import uuid

myId = uuid.uuid4()
print(myId)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接