我有一个包含3列A(,B,C)的表,并有2个约束
例如数据集
a1:b1:错误
a1:b2:是
a1:b3:错误
a2:b1:是
a2:b2:错误
a2:b3:错误
答案 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模型定义,因为我不确定哪种解决方案最适合您的需求。