Я использую 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
(это каскадно переходит в модель, что является ожидаемым поведением).
Любая помощь приветствуется! Спасибо за чтение, удачного дня.