SqlAlchemy: порядок обновления и вставки неправильный с внешним ключом к себе - PullRequest
2 голосов
/ 16 сентября 2010

У меня есть таблица, которая имеет отношение внешнего ключа к себе (по составному первичному ключу)

например. что-то вроде следующего:

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 выдает UPDATE для существующего объекта, прежде чем выдает INSERT для создания new_obj. Моя база данных справедливо жалуется на ОБНОВЛЕНИЕ, что она не может найти внешний ключ graph_other (поскольку new_obj еще не был вставлен).

Я думал, что SqlAlchemy должен был быть умным в отношении порядка SQL? Я использую версию 0.5.4

Есть ли способ вручную упорядочить операции?

1 Ответ

1 голос
/ 31 июля 2012

Хотя этот вопрос довольно старый и ОП, вероятно, потерял интерес, у него есть ответ в текущей версии SA на 0.7.В документации есть раздел , в котором обсуждаются особые случаи отношений «многие ко многим» , в которые входит простой пример узла графа с использованием ORM.

Особый вопрос ОП заключался в том, как управлять порядком INSERT и UPDATE для тех случаев, когда новые элементы указывают друг на друга.Документы SA содержат здесь примеры для решения такого рода проблем с взаимозависимыми строками:

Чтобы разрешить использование дополнительного оператора UPDATE, мы используем параметр отношений post_update().Это указывает на то, что связь между двумя строками должна быть создана с помощью инструкции UPDATE после того, как обе строки были вставлены

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...