布尔列上的sqlalchemy约束

时间:2013-08-24 08:03:03

标签: sqlalchemy unique-constraint check-constraint

我有一个包含3列A(,B,C)的表,并有2个约束

  1. A和B应该是共同唯一的,我通过定义一个唯一约束来完成。
  2. 对于A中的任何给定值,C中只能有一个True(A,C = True)必须是唯一的。 我需要帮助来定义第二个约束。
  3. 例如数据集

    A:B C

    a1:b1:错误

    a1:b2:是

    a1:b3:错误

    a2:b1:是

    a2:b2:错误

    a2:b3:错误

1 个答案:

答案 0 :(得分:2)

我不认为这可以在不更改架构的情况下以数据库可移植的方式表达。部分索引可以这样做:

CREATE UNIQUE INDEX One_C_Per_A_Idx ON Table(A) WHERE C;

但它仅适用于PostgreSQL和SQL Server(并使用Oracle上的功能索引进行模拟)。使用PostgreSQL后端,您可以使用postgresql_where关键字参数Index(请参阅docs)在SQLAlchemy中定义部分索引。

一种可移植的方法是将其拆分为至少两个表,将显式布尔列转换为隐式“存在于引用表”表达式中。 SQL:

CREATE TABLE my_table (
    a integer NOT NULL,
    b integer NOT NULL,
    PRIMARY KEY (a, b)
);

CREATE TABLE flagged (
    a integer NOT NULL PRIMARY KEY,
    b integer NOT NULL,
    FOREIGN KEY (a, b) REFERENCES my_table(a, b)
);

查询以获得原始表的等价物:

SELECT t.a, t.b, f.a IS NOT NULL AS c
FROM my_table t LEFT OUTER JOIN flagged f ON t.a = f.a AND t.b = f.b;

我现在将省略SQLAlchemy模型定义,因为我不确定哪种解决方案最适合您的需求。