Подзапросы SQLAlchemy запрещены в обходном пути ограничений CHECK

У меня есть база данных, использующая декларативное сопоставление с двумя таблицами, где одна таблица должна проверять, имеет ли столбец другой таблицы определенное значение хотя бы один раз. Я не могу использовать ограничение внешнего ключа, потому что значение не уникально.

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

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

Danila Ganchar 08.02.2019 15:17

@Danila Ganchar Почему я должен удалять данные из Table_A? Я не знаю, можно ли удалять данные из разных таблиц в классе DeclarativeBase. После вставки в Table_B мне нужно то же содержимое в Table_A, что и до вставки в Table_B.

Wuuzzaa 08.02.2019 15:54
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
124
0

Другие вопросы по теме