2015-01-16 17 views
14

SQLAlchemy hỗ trợ tạo partial indexes in postgresql.Tạo chỉ mục một phần duy nhất với sqlalchemy trên Postgres

Có thể tạo partial unique index thông qua SQLAlchemy không?

Hãy tưởng tượng một bảng/mô hình như vậy:

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

Tôi muốn một chỉ số duy nhất, nơi có thể chỉ có một "hoạt động" ScheduledPayment cho một hóa đơn nào.

tôi có thể tạo ra điều này bằng tay trong postgres:

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

Tôi đang tự hỏi làm thế nào tôi có thể thêm rằng để mô hình SQLAlchemy tôi sử dụng SQLAlchemy 0.9.

Trả lời

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

Hoàn hảo .... cảm ơn bạn! – brianz

1

Trong trường hợp ai đó dừng lại bằng cách nhìn để thiết lập một hạn chế duy nhất một phần với một cột có thể tùy chọn được NULL, dưới đây là cách:

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

nơi user_id là một cột có thể được NULL và tôi muốn một ràng buộc duy nhất được thực thi trên tất cả ba cột (name, category, user_id) với NULL chỉ là một trong các giá trị được phép cho user_id.

Các vấn đề liên quan