Skip to main content
 首页 » 编程设计

python之如何使用 sqlalchemy 中的关系更改父级

2025年05月04日10落叶无声

下面是与 backref 和 delete 级联关系的简单示例。

class Parent(Base): 
    __tablename__ = 'parent' 
    id = Column(Integer, primary_key=True) 
 
class Child(Base): 
    __tablename__ = 'child' 
    id = Column(Integer, primary_key=True) 
    parent_id = Column(Integer, ForeignKey('Parent.id')) 
    parent = relation( 
        'Parent', 
        backref=backref('children', cascade='delete, delete-orphan') 
    ) 

需要将一些子项从一个父项重新分配给另一个父项,然后需要删除另一个父项,但是 sqlalchemy 在删除父项之前删除了子项...

p1 = Session.query(Parent).get(...) 
p2 = Session.query(Parent).get(...) 
 
p1.children.extend(p2.children) 
Session.delete(p2) 
Session.commit() 

日志:

... [worker 0] UPDATE child SET parent_id=%(parent_id)s WHERE child.id = %(child_id)s 
... 
... [worker 0] DELETE FROM child WHERE child.id = %(id)s 
... 
... [worker 0] DELETE FROM parent WHERE parent.id = %(id)s 
... 
... [worker 0] COMMIT 

需要以某种方式将 child 与另一个 parent 分开......

请您参考如下方法:

我可以建议的唯一解决方案是:

p1 = Session.query(Parent).get(...) 
p2 = Session.query(Parent).get(...) 
 
for child in p2.children[:]: 
    child.parent = p1 
 
Session.delete(p2) 
Session.commit()