Как автоматически сгенерировать UUID для Postgres в Python? - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь создать объекты в 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

Похоже, я не предоставил никакого удостоверения личности. Итак, как я могу заставить базу данных автоматически сгенерировать ее или сгенерировать самостоятельно?

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Вы, кажется, используете этот код . Для столбца отсутствует значение по умолчанию. Вы эмулируете этот 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()"),)

В качестве альтернативы, если вы не хотите загружать UGID-расширение Postgres, вы можете создать UUID в Python.

from uuid import uuid4

id = Column(UUID(as_uuid=True),
    primary_key=True,
    default=uuid4,)
0 голосов
/ 29 августа 2018

Вы можете использовать модуль uuid и просто установить столбец по умолчанию. Например:

from uuid import uuid4
from sqlalchemy import Column, String

class Role(Base):
    __tablename__ = 'role'

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