Потеря записей DuckDB при выходе из FlaskPython

Программы на Python
Ответить
Anonymous
 Потеря записей DuckDB при выходе из Flask

Сообщение Anonymous »

Я только что закончил миграцию своего приложения Flask с Postgres на DuckDB, и почти все работает отлично. Однако есть одна очень странная проблема, из-за которой я часами бился головой о стену и, похоже, не мог разобраться в ней.
В одном из моих маршрутов Flask происходят различные вещи, относящиеся к материалам, которые загружает пользователь. В ходе обработки файлы проходят через приложение, которое обновляет несколько разных таблиц в базе данных. В приложении все выглядит на 100% нормально и правильно, но когда я выхожу из Flask, последние три обновления таблицы просто исчезают. Данный маршрут Flask действительно длинный и сложный, но до определенного момента все работает идеально, как и раньше…

Код: Выделить всё

   ** whole bunch of stuff happens above here **

try:
db.session.commit()
except Exception as e:
db.session.rollback()

db.session.add(new_audit_history_entry)
db.session.add(new_audit_log_entry)

try:
db.session.commit()
except Exception as e:
db.session.rollback()

update_task = TaskQueue.query.get(task_id)
update_task.completed_at = datetime.now()
update_task.status = 'Complete'

try:
db.session.commit()
except Exception as e:
db.session.rollback()
finally:
audit_history = AuditHistory.query.all()
audit_logs = AuditLog.query.all()
tasks = TaskQueue.query.all()
db.session.flush()
db.session.close()

return jsonify({'message': 'Files saved and validated!', 'This many files: ': len(files)})
Я не получаю никаких ошибок, и в приложении все выглядит нормально — я вижу все, что ожидал увидеть. Все хорошо. Но затем, если я выйду из Flask (ctl+c в CLI), все, начиная с db.session.add(new_audit_history_entry), просто исчезнет. Записи в таблицах Audit_history и Audit_log исчезают, а таблица TaskQueue вернулась к своему состоянию дальше по маршруту при последнем обновлении (до окончательной фиксации этой таблицы, показанной выше).
Единственная подсказка, которую я видел, — когда я запускаю резервное копирование Flask, я получаю следующее:

Код: Выделить всё

Exception in WAL playback: Violates foreign key constraint because key "auditid: 95693563-b229-40d7-9b12-5c4447bdb601" does not exist in the referenced table
So it seems that those final commits are not being fully saved? Они сохраняются только в логике упреждающей записи Дака или что-то в этом роде? Я перепробовал все возможные комбинации коммитов и сбросов, чтобы принудительно внести эти окончательные обновления в базу данных, и ничего не получилось.
Чтобы внести ясность, я не прерываю приложение в середине записи или чего-то еще, я выхожу и перезапускаю его после того, как эти записи завершатся. Как будто я убежден, что могу запустить приложение в течение дня, и ни одна из этих записей не сохранится после выхода. Кроме того, я элегантно обрабатываю прерывание клавиатуры в своем приложении, включая окончательную фиксацию базы данных для наглядности.
Что мне не хватает? Есть ли что-то особенное в утке, что мне нужно сделать?

Подробнее здесь: https://stackoverflow.com/questions/783 ... ting-flask
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»