2

backref と delete cascade との関係の簡単な例を次に示します。

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

どういうわけか、子供を別の親から切り離す必要があります...

4

1 に答える 1

0

私が提案できる唯一の解決策は次のとおりです。

p1 = Session.query(Parent).get(...)
p2 = Session.query(Parent).get(...)

for child in p2.children[:]:
    child.parent = p1

Session.delete(p2)
Session.commit()
于 2012-11-08T08:54:32.137 に答える