我正在尝试构建一个对象树。类看起来是这样的:
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,'无法添加或更新子行:外键约束失败(
db
.network_nodes
,constraintnetwork_nodes_ibfk_2
foreign key(left_id
)REFERENCESnetwork_nodes
(id
))')[SQL:更新网络节点SET left_id=%s,right_id=%d WHERE network_nodes.id=%s][参数:('S5837124','S5839010','S5832131')]
我假设脏对象在新对象之前提交。因此left_id
是指尚未存在的记录。
如何在脏对象之前提交新对象?
如何在脏对象之前提交新对象?
您可以添加所有对象,刷新新对象,然后提交整个批:
left = Node(id=element_id, parent_id=node.id)
session.add(left)
node.left_id = element_id
session.flush(session.new)
session.commit()