2015-06-10 23 views
3

在創建新記錄之前,我想檢查native_linux_useris_active的組合是唯一的條件,但is_active必須是True。多個native_linux_useris_active=False可能存在,但只有一個native_linux_useris_active=True可以存在。在`UniqueConstraint`創建`CheckConstraint`

我試圖在這樣的UniqueConstraint內使用CheckConstraint,但它不起作用。我如何製作這種類型的約束?

__table_args__ = (
    UniqueConstraint(
     'native_linux_user', 
     CheckConstraint('is_active=True', name='active_check'), 
     name='_username_uniqueness' 
    ), 
) 

回答

3

從SQL方面,你可以創建部分UNIQUE指數:

CREATE UNIQUE INDEX idx_unique_native_linux_user_is_active 
    ON table (native_linux_user) WHERE is_active=True; 

而且SQLAlchemy的模型對應的Index

class Foo(Model): 
    id = Column(Integer, primary_key=True) 
    native_linux_user = Column(String, nullable=False) 
    is_active = Column(Boolean) 

    __table_args__ = (
     Index('idx_unique_native_linux_user_is_active', native_linux_user, 
      unique=True, 
      postgresql_where=(is_active==True), 
     ), 
    ) 
+0

,會是什麼語法,如果我使用MySQL作爲數據庫? – Nagri

+0

@Nagri - 不知道,但我認爲它實際上並不支持此功能。 (它的叉子可能也是一樣的:Drizzle,MariaDB,Percona Server和WebScaleSQL) – plaes

相關問題