【问题标题】:How to change parent using relations in sqlalchemy?如何使用 sqlalchemy 中的关系更改父级?
【发布时间】:2012-10-28 08:08:01
【问题描述】:

这里是与 backref 和删除级联关系的简单示例。

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

需要以某种方式将孩子与另一个父母分开......

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

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

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

    【讨论】:

    • 但这对我不起作用(SQLAlchemy 1.1.15)! child.parent = p1 生成此更新查询:UPDATE child SET parent = 3 WHERE child.id = 45。但是句子Session.delete(p2) 会生成:UPDATE child SET parent = NULL WHERE child.id = 45
    • 我承认不行,已经六年了:)
    • !你知道有什么新的解决方案吗?
    猜你喜欢
    • 2017-06-29
    • 2012-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    相关资源
    最近更新 更多