У меня есть база данных, использующая декларативное сопоставление с двумя таблицами, где одна таблица должна проверять, имеет ли столбец другой таблицы определенное значение хотя бы один раз. Я не могу использовать ограничение внешнего ключа, потому что значение не уникально.
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)
...
Пример таблицы А
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?
Программное обеспечение:
Питон 3.6.4
SQLAlchemy 1.2.7
версия sqlite: 3.15.2
@Danila Ganchar Почему я должен удалять данные из Table_A? Я не знаю, можно ли удалять данные из разных таблиц в классе DeclarativeBase. После вставки в Table_B мне нужно то же содержимое в Table_A, что и до вставки в Table_B.






как насчет удаления записей с
Table_A? Можно ли удалить данные?