Python 查询删除不会从关联表中删除条目
我实现了一个自引用多对多关系的关联表。类似于中所述。但是,当我使用Python 查询删除不会从关联表中删除条目,python,python-3.x,sqlite,sqlalchemy,Python,Python 3.x,Sqlite,Sqlalchemy,我实现了一个自引用多对多关系的关联表。类似于中所述。但是,当我使用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() ==
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')
型号:
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)
如果我将会话.query(Node).delete()
替换为:
session.delete(a)
或
…然后断言按预期传递
从节点
表中删除所有对象的正确方法是什么,以确保删除链接
表中的相应条目?如aboutQuery.delete()中所述:
该方法在Python中不提供关系的级联,而是
假设为任何类型配置了ON DELETE CASCADE/SET NULL/etc
需要它的外键引用,否则数据库可能会
如果正在执行外键引用,则发出完整性冲突
强制执行
我最后只写了如下删除内容:
for node in session.query(Node).all():
session.delete(node)
这比批量删除效率低得多。为了提高运行速度,必须在DBMS级别正确配置外键。从M2M关联表中删除外键可能会有所帮助。