CHECK约束变通办法中禁止使用SQLAlchemy子查询

时间:2019-02-07 16:12:22

标签: python database sqlite sqlalchemy

我有一个使用声明式映射和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

0 个答案:

没有答案
相关问题