Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查询删除不会从关联表中删除条目_Python_Python 3.x_Sqlite_Sqlalchemy - Fatal编程技术网

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)

…然后断言按预期传递

节点
表中删除所有对象的正确方法是什么,以确保删除
链接
表中的相应条目?

如about
Query.delete()中所述:

该方法在Python中不提供关系的级联,而是 假设为任何类型配置了ON DELETE CASCADE/SET NULL/etc 需要它的外键引用,否则数据库可能会 如果正在执行外键引用,则发出完整性冲突 强制执行

我最后只写了如下删除内容:

for node in session.query(Node).all():
    session.delete(node)
这比批量删除效率低得多。为了提高运行速度,必须在DBMS级别正确配置外键。

从M2M关联表中删除外键可能会有所帮助。