Sqlalchemy круговая зависимость при использовании полиморфной идентичности и отношения к основному объекту - PullRequest
0 голосов
/ 15 октября 2019

Когда я создаю 3 класса в качестве моделей SQLAlchemy, где один является базовым, а 2 - наследующими объектами. Я использую полиморфную идентичность, чтобы понять это.

Class1 = Base
Class2(Base) = Inheriting class 1
Class3(Base) = Inheriting class 2

Теперь Class3 имеет отношение к Class1. Мне это нужно, потому что в моем Class3 есть список этих объектов, где каждый элемент может быть Class2 или Class3. Это похоже на цепочку, в начальном классе есть отношение списка с Class1, и если там есть Class3, то условие сравнивается. Если это приводит к истине, новый список Объектов Class1 будет обработан, и если это приведет к ложному, другой список Объектов Class1 будет обработан. Когда я делаю это, SQLAlchemy говорит мне, что обнаружена циклическая зависимость. После добавления аргументов первичного объединения он все равно говорит мне, что не может идентифицировать объединения.

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

class chainlink(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    type = db.Column(db.String(50))
    __mapper_args__ = {
        "polymorphic_identity":"chainlink",
        "polymorphic_on":type

class chainlinkcommand(chainlink):
    id = db.Column(db.Integer, db.ForeignKey("chainlink.id"), primary_key=True)
    __mapper_args__ = {
        "polymorphic_identity":"chainlinkcommand",
    }

class chainlinkcondition(chainlink):
    id = db.Column(db.Integer, db.ForeignKey("chainlink.id"), primary_key=True)
    truechain = db.relationship("chainlink", cascade="all, delete, delete-orphan")
    falsechain = db.relationship("chainlink", cascade="all, delete, delete-orphan")
    __mapper_args__ = {
        "polymorphic_identity":"chainlinkcondition",
    }

sqlalchemy.exc.CircularDependencyError: Обнаружена циклическая зависимость. (DeleteState ())

Это ошибка, которую я получаю в начальном состоянии, при попытке выразить условия соединения я получаю следующую ошибку.

sqlalchemy.exc.AmbiguousForeignKeysError: Can '• определить соединение между «звеном цепи» и «условием звена цепи»;таблицы имеют более одного отношения ограничения внешнего ключа между ними. Пожалуйста, укажите 'onclause' этого соединения явно.

Я мог бы легко это исправить, если бы я просто не использовал отношения SQLAlchemys для этого, а просто сохранил идентификатор как int, а затем сам сделал каскад, однако эточувствует кину грубую и плохую практику. Буду признателен за вашу помощь.

...