これは、スキーマを変更せずにデータベースに移植可能な方法で表現できるとは思いません。部分インデックスはこれを行うことができます:
CREATE UNIQUE INDEX One_C_Per_A_Idx ON Table(A) WHERE C;
ただし、これは PostgreSQL と SQL Server でのみ使用できます (また、Oracle の関数インデックスでシミュレートされます)。PostgreSQL バックエンドでは、postgresql_where
キーワード引数 to Index
( docsを参照) を使用して、SQLAlchemy で部分インデックスを定義できます。
移植可能な方法は、これを少なくとも 2 つのテーブルに分割し、明示的なブール列を暗黙的な「参照テーブルに存在する」式に変換することです。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 モデルの定義はここでは省略します。どのソリューションがあなたのニーズに最も適しているかわからないからです。