SqlAlchemy:UPDATE和INSERT命令对自己的外键错误

时间:2010-09-16 19:45:12

标签: sqlalchemy

我有一个与自身具有外键关系的表(在复合主键上)

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版本

有没有办法手动订购操作?

1 个答案:

答案 0 :(得分:1)

虽然这个问题已经很久了,OP可能会失去兴趣,但它在目前的0.7版SA中有一个答案。该文档有一个section discussing special cases of Many-to-Many relationships,其中包含一个使用ORM的简单图节点示例。

OP的具体问题是如何在新元素相互指向的情况下控制INSERTUPDATE的顺序。 SA docs provide examples here用于处理与Mutually-Dependent行相关的这类问题:

  

要启用补充UPDATE语句,我们使用   关系()的post_update选项。这指定了链接   应该在之后使用UPDATE语句创建两行之间   这两行都已被INSERTED