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



我正在尝试在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)

但是当我创建对象时

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

看起来我没有提供任何身份证件。那么,如何使数据库自动生成或自行生成呢?

您似乎正在使用此代码。它缺少列的默认值。您正在模拟此 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,)

您可以使用uuid模块并仅设置列默认值。例如:

from uuid import uuid4
from sqlalchemy import Column, String
class Role(Base):
__tablename__ = 'role'
id = Column(String, primary_key=True, default=uuid4)

我实际上得出的是:

import uuid
class SomeClass(db.Model):
__tablename__ = 'someclass'
id = db.Column(UUID(as_uuid=True),
primary_key=True, default=lambda: uuid.uuid4().hex)
import uuid
myId = uuid.uuid4()
print(myId)

最新更新