查询删除不会从关联表中删除条目

时间:2015-04-18 16:13:01

标签: python python-3.x sqlite sqlalchemy

我为自引用的多对多关系实现了一个关联表。与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表中的相应条目?

1 个答案:

答案 0 :(得分:0)

SQLAlchemy documentation中关于Query.delete()

所述
  

该方法不提供Python内级联关系 - 它是   假设ON DELETE CASCADE / SET NULL / etc.是为任何配置   需要它的外键引用,否则数据库可能   如果存在外键引用,则发出完整性违规   执行。

我最后写的删除如下:

for node in session.query(Node).all():
    session.delete(node)

这比批量删除效率低得多。要提高运行时速度,必须在DBMS级别上正确配置外键。