Подтвердить что ты не робот

Создание частичного уникального индекса с sqlalchemy на Postgres

SQLAlchemy поддерживает создание частичных индексов в postgresql.

Можно ли создать частичный уникальный индекс через SQLAlchemy?

Представьте себе таблицу/модель следующим образом:

class ScheduledPayment(Base):
     invoice_id = Column(Integer)
     is_canceled = Column(Boolean, default=False)

Мне нужен уникальный индекс, где для данного счета может быть только один "активный" ScheduledPayment.

Я могу создать это вручную в postgres:

CREATE UNIQUE INDEX only_one_active_invoice on scheduled_payment 
     (invoice_id, is_canceled) where not is_canceled;

Мне интересно, как я могу добавить это в мою модель SQLAlchemy с помощью SQLAlchemy 0.9.

4b9b3361

Ответ 1

class ScheduledPayment(Base):
    id = Column(Integer, primary_key=True)
    invoice_id = Column(Integer)
    is_canceled = Column(Boolean, default=False)

    __table_args__ = (
        Index('only_one_active_invoice', invoice_id, is_canceled,
              unique=True,
              postgresql_where=(~is_canceled)),
    )

Ответ 2

В случае, если кто-то останавливается, пытаясь настроить частичное уникальное ограничение с помощью столбца, который необязательно может быть NULL, вот как:

__table_args__ = (
    db.Index(
        'uk_providers_name_category',
        'name', 'category',
        unique=True,
        postgresql_where=(user_id.is_(None))),
    db.Index(
        'uk_providers_name_category_user_id',
        'name', 'category', 'user_id',
        unique=True,
        postgresql_where=(user_id.isnot(None))),
)

где user_id - столбец, который может быть NULL, и я хочу, чтобы для всех трех столбцов (name, category, user_id) с NULL было установлено единственное ограничение, просто являющееся одним из допустимых значений для user_id.