我为自引用的多对多关系实现了一个关联表。与SQLAlchemy documentation中描述的类似。但是,当我使用session.query(Node).delete()
删除所有节点对象时,关联表会保留其条目。
可重复示例:
a, b = Node(), Node()
a.children = [b]
session.add_all([a, b])
session.commit()
session.query(Node).delete()
session.commit()
assert(session.query(Node).count() == 0)
assert(session.query(link).count() == 0)
型号:
Base = declarative_base()
link = Table('link', Base.metadata,
Column('parent', Integer, ForeignKey('node.id')),
Column('child', Integer, ForeignKey('node.id')))
class Node(Base):
__tablename__ = 'node'
id = Column(Integer, primary_key=True)
children = relationship('Node',
secondary=link,
primaryjoin=id == link.c.parent,
secondaryjoin=id == link.c.child,
backref='parents')
第一个断言按预期传递。第二个断言失败了。 (1!= 0)
如果我将session.query(Node).delete()
替换为:
session.delete(a)
或
session.delete(b)
...然后断言按预期传递。
从Node
表中删除所有对象的正确方法是什么,以确保删除link
表中的相应条目?
答案 0 :(得分:0)
如SQLAlchemy documentation中关于Query.delete()
:
该方法不提供Python内级联关系 - 它是 假设ON DELETE CASCADE / SET NULL / etc.是为任何配置 需要它的外键引用,否则数据库可能 如果存在外键引用,则发出完整性违规 执行。
我最后写的删除如下:
for node in session.query(Node).all():
session.delete(node)
这比批量删除效率低得多。要提高运行时速度,必须在DBMS级别上正确配置外键。