У меня есть база данных, использующая декларативное сопоставление с 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
с classification
, равным a, b или c -> вставляем новую строку в базу данных.
Все остальные значения для classification
должны вызывать ошибку.
То, что я пытался:
Я пытался использовать CheckConstraint в Table_B
который точно достиг бы того, что я хочу, как следующий код:
CheckConstraint("classification IN (SELECT classification_a FROM Table_A)")
это приводит к sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) subqueries prohibited in CHECK constraints
, потому что sqlite3 не поддерживает подзапросы в проверках.
По этому вопросу это былопредложил использовать декоратор @validates
, но я не знаю, как мне проверить другие столбцы таблицы в этом методе, потому что у меня нет доступа к сеансу в методе с декоратором.https://stackoverflow.com/a/7890829/10685
Вопрос:
Как мне реализовать свое «ограничение» в классе Table_B
?
Программное обеспечение:
Python 3.6.4
SQLAlchemy 1.2.7
Версия sqlite: 3.15.2