SQLAlchemy 更新对象树

SQLAlchemy update objects tree

我正在尝试构建对象树。 class 看起来像这样:

class Node(BaseModel, db.Model):
    '''Node model'''
    __tablename__ = 'network_nodes'
    id = Column(String(10), primary_key=True)
    parent_id = Column(String(10), ForeignKey('network_nodes.id'))
    parent = relationship("Node", foreign_keys=[parent_id], lazy='dynamic')
    left_id = Column(String(10), ForeignKey('network_nodes.id'))
    left = relationship("Node", foreign_keys=[parent_id], lazy='dynamic')
    right_id = Column(String(10), ForeignKey('network_nodes.id'))
    right = relationship("Node", foreign_keys=[parent_id], lazy='dynamic')

每当添加新叶子时,都会执行此代码:

node.left_id = element_id
left = Node(id=element_id, parent_id=node.id)
db.session.add(left)

并且在某些时候我使用 db.session.commit() 提交所有更改。在 commit() 点,我在会话中看到脏对象和新对象。但是提交失败并出现错误:

(MySQLdb._exceptions.IntegrityError) (1452, 'Cannot add or update a child row: a foreign key constraint fails (db.network_nodes, CONSTRAINT network_nodes_ibfk_2 FOREIGN KEY (left_id) REFERENCES network_nodes (id))') [SQL: UPDATE network_nodes SET left_id=%s, right_id=%s WHERE network_nodes.id = %s] [parameters: ('S5837124', 'S5839010', 'S5832131')]

我假设脏对象先于新对象提交。因此 left_id 指的是尚未存在的记录。

如何让新对象在脏对象之前提交?

How can I make new object committed before dirty ones?

您可以添加所有对象,刷新新对象,然后提交整个批次:

    left = Node(id=element_id, parent_id=node.id)
    session.add(left)
    node.left_id = element_id
    
    session.flush(session.new)
    session.commit()