SQLAlchemy разница между queryset.delete () и session.delete (model_instance) - PullRequest
0 голосов
/ 06 августа 2020

Я использую SQLAlchemy для ORM, и я столкнулся с запутанной разницей между queryset.delete() (например, session.query(Model).delete()) и session.delete(model_instance).

У меня есть две связанные модели (родительский потомок), и я ожидаю, что дочерние элементы будут удалены при удалении родителя, но это работает только при использовании session.delete(instance), но при удалении с помощью запроса выдает следующую ошибку: sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) FOREIGN KEY constraint failed

Как видите, я использую SQLite с активированной прагмой Foreignkey.

Код для двух классов:

class Variable(Base):
    __tablename__ = "variables"

    id = Column(Integer,primary_key=True)
    name = Column(String,unique=True)

    varsets = relationship(
            "Varset",
            secondary = VarsetsVariables,
            back_populates = "variables",
            cascade="save-update",
        )

    #dataset_id = Column(Integer,ForeignKey("datasets.id"))

    models = relationship(
            "views.storage.orm.Model",
            #back_populates="depvar",
            cascade = "all, delete-orphan",
        )

    def __repr__(self):
        return f"Variable: {self.name}"

class Model(Base):
    __tablename__ = "models"
    id = Column(Integer,primary_key=True)

    name = Column(String,unique=True)
    path = Column(String)

    depvar_id = Column(Integer,ForeignKey("variables.id"))
    depvar = relationship("Variable",back_populates="models")

    themes = relationship(
            "Theme",
            secondary = ModelsThemes,
            back_populates = "models",
        )

Рассматриваемая взаимосвязь - Переменная как зависимая переменная для модели. Ошибка возникает, когда я удаляю переменные с помощью запроса, но не когда зависимая переменная удаляется с помощью session.delete (это каскадно переходит в модель, что является ожидаемым поведением).

Любая помощь приветствуется! Спасибо за чтение, удачного дня.

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