2015-01-16 10 views
14

SQLAlchemy unterstützt erstellen partial indexes in postgresql.Erstellen partiellen eindeutigen Index mit SQLALCHEMY auf Postgres

Ist es möglich, eine partial unique index über SQLAlchemy zu erstellen?

einen Tisch/Modell Stellen Sie sich vor, wie so:

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

ich einen eindeutigen Index möchte, wo es nur ein „aktives“ ScheduledPayment für eine bestimmte Rechnung sein.

Ich kann dies manuell erstellen in Postgres:

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

Ich frage mich, wie ich das meinem SQLAlchemy Modell 0.9 SQLAlchemy mit hinzufügen.

Antwort

22
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)), 
    ) 
+0

Perfekt .... danke! – brianz

1

Falls jemand stoppt, indem man eine partielle eindeutige Einschränkung mit einer Spalte einrichten, die optional NULL sein kann, ist hier, wie:

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

wo user_id eine Spalte ist, die NULL und ich sein kann möchte eine eindeutige Beschränkung in allen drei Spalten (name, category, user_id) mit NULL erzwungen nur einer der zulässigen Werte für user_id.

Verwandte Themen