Зачем флеш, если вы можете совершить?
Как кто-то новичок в работе с базами данных и sqlalchemy, предыдущие ответы - которые flush()
отправляют операторы SQL в БД и commit()
сохраняют их - были мне неясны. Определения имеют смысл, но из определений не сразу понятно, почему вы бы использовали сброс, а не просто фиксацию.
Поскольку коммит всегда сбрасывается ( https://docs.sqlalchemy.org/en/13/orm/session_basics.html#committing ), эти звуки действительно похожи. Я думаю, что большая проблема, которую нужно подчеркнуть, заключается в том, что сброс не является постоянным и может быть отменен, тогда как фиксация является постоянной, в том смысле, что вы не можете попросить базу данных отменить последний коммит (я думаю)
@snapshoe подчеркивает, что если вы хотите запросить базу данных и получить результаты, которые включают вновь добавленные объекты, вам нужно сначала очистить (или зафиксировать, что для вас сбросит). Возможно, это полезно для некоторых людей, хотя я не уверен, почему вы хотели бы сбрасывать, а не фиксировать (кроме простого ответа, что его можно отменить).
В другом примере я синхронизировал документы между локальной БД и удаленным сервером, и если пользователь решил отменить, все добавления / обновления / удаления должны быть отменены (т. Е. Нет частичной синхронизации, только полная синхронизация). При обновлении одного документа я решил просто удалить старую строку и добавить обновленную версию с удаленного сервера. Оказывается, из-за способа написания sqlalchemy порядок операций при фиксации не гарантируется. Это привело к добавлению дублирующейся версии (перед попыткой удалить старую), что привело к тому, что БД не прошла уникальное ограничение. Чтобы обойти это, я использовал flush()
так, чтобы порядок сохранялся, но я все еще мог отменить, если позже процесс синхронизации не удался.
Смотрите мой пост по этому адресу: Есть ли порядок добавления или удаления при фиксации в sqlalchemy?
Точно так же кто-то хотел знать, поддерживается ли порядок добавления при фиксации, то есть, если я добавляю, а object1
затем добавляю object2
, object1
добавляется ли в базу данных раньше object2
Сохраняет ли SQLAlchemy порядок при добавлении объектов в сеанс?
Опять же, здесь, вероятно, использование flush () обеспечит желаемое поведение. Таким образом, в общем, одно из применений для сброса - предоставить гарантии заказа (я думаю), опять же, при этом оставляя себе возможность «отменить», которую не предоставляет commit.
Автозапуск и Автокоммит
Обратите внимание, что autoflush может использоваться для обеспечения того, чтобы запросы действовали в обновленной базе данных, поскольку sqlalchemy будет сбрасываться перед выполнением запроса. https://docs.sqlalchemy.org/en/13/orm/session_api.html#sqlalchemy.orm.session.Session.params.autoflush
Autocommit - это еще кое-что, что я не совсем понимаю, но похоже, что его использование не рекомендуется:
https://docs.sqlalchemy.org/en/13/orm/session_api.html#sqlalchemy.orm.session.Session.params. автокоммит
Использование памяти
Теперь первоначальный вопрос на самом деле хотел узнать о влиянии flush на commit для памяти. Поскольку способность сохранять или нет - это то, что предлагает база данных (я думаю), простой очистки должно быть достаточно для разгрузки базы данных - хотя фиксация не должна повредить (на самом деле, вероятно, помогает - см. Ниже), если вы не заботитесь об отмене ,
sqlalchemy использует слабые ссылки для сброшенных объектов: https://docs.sqlalchemy.org/en/13/orm/session_state_management.html#session-referencing-behavior
Это означает, что если у вас нет объекта, явно удерживаемого где-то, например, в списке или dict, sqlalchemy не будет хранить его в памяти.
Тем не менее, у вас есть проблемы с базой данных. Предположительно очистка без фиксации сопровождается некоторой потерей памяти для поддержки транзакции. Опять же, я новичок в этом, но вот ссылка, которая, кажется, предлагает именно это: https://stackoverflow.com/a/15305650/764365
Другими словами, коммиты должны уменьшить использование памяти, хотя, вероятно, здесь есть компромисс между памятью и производительностью. Другими словами, вы, вероятно, не хотите фиксировать каждое отдельное изменение базы данных, по одному (из соображений производительности), но слишком долгое ожидание увеличит использование памяти.