我有一个使用声明式映射和2个表的数据库,其中一个表至少需要检查另一个表的列是否具有特定值。我不能使用外键约束,因为该值不是唯一的。
class Table_A(DeclarativeBase):
classification_a = Column(String)
classification_b = Column(String)
value= Column(REAL)
...
class Table_B(DeclarativeBase):
name= Column(String)
classification = Column(String) # must be in Table_A.classification_a
value= Column(REAL)
...
示例表A
classification_a classification_b value
a a 5
a b 8
a c 0
b a 1
b b 6
b c 8
c a 9
c b 7
c c 9
我想要的:
当我插入Table_B
等于a,b或c的classification
时,将新行插入数据库。
classification
的所有其他值应引发错误。
我尝试过的事情:
我尝试在Table_B
中使用CheckConstraint,它会完全实现我想要的代码,如以下代码:
CheckConstraint("classification IN (SELECT classification_a FROM Table_A)")
这导致sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) subqueries prohibited in CHECK constraints
,因为sqlite3不支持Checks中的子查询。
在这个问题上,建议使用@validates
装饰器,但是我不知道如何检查此方法中的其他表列,因为我无法使用装饰器访问该方法内的会话。
https://stackoverflow.com/a/7890829/10685
问题:
如何在Table_B
类中实现我的“约束”?
软件:
Python 3.6.4
SQLAlchemy 1.2.7
sqlite版本:3.15.2