Запросы SQLAlchemy запрещены в обходе ограничений CHECK - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть база данных, использующая декларативное сопоставление с 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...