Создание частичного уникального индекса с 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.
Ответы
Ответ 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
.