Есть ли порядок добавления или удаления при фиксации в sqlalchemy? - PullRequest
0 голосов
/ 23 марта 2020

Я добавляю несколько записей в таблицу в sqlalchemy. Если запись уже существует, основываясь на каком-то ключе, я удаляю строку в таблице, а затем добавляю «обновленную» запись. После окончания удаления и добавления всех записей я фиксирую сеанс. Однако во время тестирования происходит сбой фиксации из-за сбоя уникального ограничения. Насколько я понимаю из этой ошибки, я пытаюсь добавить обновленную запись перед удалением старой. Если я удаляю старую запись, затем фиксирую, затем добавляю, все работает нормально.

Итак, мой вопрос: есть ли у sqlalchemy определенный порядок операций для удаления и добавления? Можно ли изменить этот порядок? Просматривая свой код, я заметил, что объект, который я добавляю, создается дважды, но добавляется только один раз (см. Ниже) - возможно, это проблема (но не уверен, почему это так).

Я тоже не хочу commit (), потому что я хочу зафиксировать, только если я добавлю / обновлю все записи.

#Inside a loop
#-----------------------
temp_doc = Document(doc)
dirty_doc = session.query(Document).filter(Document.local_id == temp.local_id).first()

#other non-relevant code here ...

session.delete(dirty_doc)

#This seems to be needed but I wouldn't expect it to be 
session.commit() 

#Later on in the code ...
if add_new_doc:
    temp_doc = Document(doc)
    session.add(temp_doc)

#Outside the loop
#-----------------------------
session.commit()
session.close()

1 Ответ

1 голос
/ 23 марта 2020

Аналогичный, но другой вопрос был задан здесь относительно того, поддерживается ли порядок в добавленных объектах: Сохраняет ли SQLAlchemy порядок при добавлении объектов в сеанс?

Это побудило посмотреть сеанс код, так как я не видел никакой документации по поведению гриппа sh.

Ссылка на код сеанса: https://github.com/sqlalchemy/sqlalchemy/blob/master/lib/sqlalchemy/orm/session.py

Поиск def _flush(self

В коде похоже, что добавления и обновления выполняются перед удалением, что объясняет, почему я сталкиваюсь с моей проблемой.

В качестве исправления я теперь сбрасываю вместо фиксации (внутри l oop), что, похоже, решает проблему. Я предполагаю, что порядок гриппа sh поддерживается, то есть команды, которые сбрасываются первыми, сначала фиксируются / сохраняются.

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