我有一个与自身具有外键关系的表(在复合主键上)
E.g。如下所示:
CREATE TABLE graph (
start_id character varying(50) NOT NULL,
end_id character varying(50) NOT NULL,
weight integer,
other_start_id character varying(50),
other_end_id character varying(50),
CONSTRAINT graph_pkey PRIMARY KEY (start_id, end_id),
CONSTRAINT graph_other FOREIGN KEY (other_start_id, other_end_id)
REFERENCES graph (start_id, end_id) MATCH SIMPLE
ON UPDATE SET NULL ON DELETE SET NULL,
)
在SqlAlchemy中,我创建一个新的(待定的)图形对象'new_obj',并将其分配给现有持久对象的另一个属性,即:
exist_obj.other = new_obj
当我提交会话时,SqlAlchemy会在发出INSERT以创建new_obj之前在现有对象上发出UPDATE。我的数据库正确地在UPDATE上抱怨它无法找到外键graph_other
(因为尚未插入new_obj)。
我认为SqlAlchemy应该对SQL的排序很聪明? 我使用的是0.5.4版本
有没有办法手动订购操作?
答案 0 :(得分:1)
虽然这个问题已经很久了,OP可能会失去兴趣,但它在目前的0.7版SA中有一个答案。该文档有一个section discussing special cases of Many-to-Many relationships,其中包含一个使用ORM的简单图节点示例。
OP的具体问题是如何在新元素相互指向的情况下控制INSERT
和UPDATE
的顺序。 SA docs provide examples here用于处理与Mutually-Dependent行相关的这类问题:
要启用补充UPDATE语句,我们使用 关系()的post_update选项。这指定了链接 应该在之后使用UPDATE语句创建两行之间 这两行都已被INSERTED