Я добавляю несколько записей в таблицу в 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()