在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
选项,但是都没有刷新操作中的会话。通过强制下一组SQL操作在另一个事务块中发生,似乎只有session.commit()
停留在其中,从而在调用parent.children
路径时导致延迟加载的副作用并将“刷新的” SQL发射到数据库。
我的问题是-是否可以让SQLAlchemy从parent.children
中删除它知道在刷新操作中删除的对象,而无需提交?