В SQLAlchemy 1.2.11, у меня есть две модели ORM, определенные так (упрощенно):
from sqlalchemy.orm import (
Column,
Integer,
ForeignKey,
)
from sqlalchemy.orm import relationship
class Parent(Base):
__tablename__ = 'parent'
# columns
id = Column(Integer, primary_key=True)
# relationships
children = relationship('Child', back_populates='parent')
class Child(Base):
__tablename__ = 'child'
# columns
id = Column(Integer, primary_key=True)
parent_id = (Integer, ForeignKey('parent.id', ondelete='cascade'))
# relationships
parent = relationship('Parent', back_populates='children')
Я создаю оба объекта, добавляю в сеанс и очищаю:
parent = Parent()
child = Child()
parent.children.append(child)
session.add(child)
session.flush()
Наконец, я удаляю дочерний объект:
session.delete(child)
session.flush()
Все соответствующие операторы SQL сбрасываются;как начальные вставки, так и последующее удаление.
Я ожидал бы, так как этот сеанс "отслеживается", что len(parent.children)
будет == 0
.Однако дочерний объект все еще присоединен.
Я поиграл с опциями cascade
по обе стороны отношения, но ни один не обновляет сеанс при операции сброса.Только session.commit()
, кажется, залипает, заставляя следующий набор SQL-операций происходить в другом блоке транзакции , вызывая побочный эффект отложенной загрузки при вызове пути parent.children
и запуске 'refreshed'SQL в БД.
Мой вопрос: возможно ли, чтобы SQLAlchemy удалял удаленные объекты из parent.children
, которые, как он знает, удаляются в операции сброса без фиксации?