【问题标题】:How to autogenerate UUID for Postgres in Python?如何在 Python 中为 Postgres 自动生成 UUID?
【发布时间】:2019-02-03 15:06:44
【问题描述】:

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

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

【问题讨论】:

标签: python postgresql sqlalchemy uuid


【解决方案1】:

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

id UUID PRIMARY KEY DEFAULT uuid_generate_v4()

但是你已经linked to the correct code了。

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,)

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 如果您正在寻找使用 PostgreSQL UUID 类型(我相信它具有一些性能优势),请参阅@Schwern 的答案。
    【解决方案3】:

    我真正想到的是:

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

    【讨论】:

      【解决方案4】:
      import uuid
      
      myId = uuid.uuid4()
      print(myId)
      

      【讨论】:

        猜你喜欢
        • 2012-09-12
        • 2014-11-30
        • 2022-08-02
        • 2011-03-15
        • 1970-01-01
        • 2021-12-16
        • 1970-01-01
        • 2019-04-01
        • 2013-07-30
        相关资源
        最近更新 更多