Навіщо рум'янець, якщо ти можеш покластися?
Як хтось, хто починає працювати з базами даних і sqlalchemy, попередні відповіді - що flush()
надсилає SQL заяви в БД і commit()
зберігає їх - не були мені зрозумілі. Визначення мають сенс, але з визначень не відразу зрозуміло, чому б ви використовували флеш замість того, щоб просто робити.
Оскільки фіксація завжди спалахує ( https://docs.sqlalchemy.org/en/13/orm/session_basics.html#committing ), вони звучать дійсно схоже. Я думаю, що головне питання, яке слід підкреслити, полягає в тому, що флеш не є постійним і його можна скасувати, тоді як фіксація є постійною, в тому сенсі, що ви не можете просити базу даних скасувати останню передачу (я думаю)
@snapshoe підкреслює, що якщо ви хочете запитувати базу даних і отримувати результати, що включають в себе щойно додані об’єкти, вам потрібно спершу розмититися (або скористатися, що буде для вас спалахнути). Можливо, це корисно для деяких людей, хоча я не впевнений, чому б ви хотіли флексувати, а не вчиняти (крім тривіальної відповіді, що це можна скасувати).
В іншому прикладі я синхронізував документи між локальною БД та віддаленим сервером, і якщо користувач вирішив скасувати, всі додавання / оновлення / видалення повинні бути скасовані (тобто відсутність часткової синхронізації, лише повна синхронізація). Під час оновлення одного документа я вирішив просто видалити стару рядок і додати оновлену версію з віддаленого сервера. Виявляється, через те, як написано sqlalchemy, порядок операцій при вчиненні не гарантується. Це призвело до додавання дубліката версії (перед спробою видалити стару), що призвело до відмови БД унікальним обмеженням. Щоб обійти це, я використав flush()
так, щоб порядок підтримувався, але я все одно міг скасувати, якщо пізніше процес синхронізації не вдався.
Дивіться мій пост про це за адресою: Чи є замовлення на додавання до видалення при здійсненні в sqlalchemy
Аналогічно, хтось хотів дізнатися, чи підтримується порядок додавання при здійсненні, тобто якщо я додаю object1
потім додаю object2
, чи object1
додається до бази даних ранішеobject2
SQLAlchemy зберігає замовлення під час додавання об'єктів до сеансу?
Знову ж таки, тут, мабуть, використання флеш () забезпечило б бажану поведінку. Отже, підсумовуючи, одне використання для флеш - це надання гарантій замовлення (я думаю), знову ж таки дозволяючи собі "скасувати" варіант, який зобов'язання не передбачає.
Автоматичне відмивання та автокомісія
Зауважте, автозаправка може бути використана для того, щоб запити діяли на оновленій базі даних, оскільки sqlalchemy буде спалахувати перед виконанням запиту. https://docs.sqlalchemy.org/en/13/orm/session_api.html#sqlalchemy.orm.session.Session.params.autoflush
Автокомісія - це щось інше, що я не повністю розумію, але це здається, що його використання перешкоджає:
https://docs.sqlalchemy.org/en/13/orm/session_api.html#sqlalchemy.orm.session.Session.params. автокомісія
Використання пам'яті
Тепер оригінальним питанням насправді хотілося дізнатися про вплив флеш-флейму на цілі пам'яті. Оскільки здатність зберігати чи ні - це те, що пропонує база даних (я думаю), просто промивання повинно бути достатнім для завантаження в базу даних, хоча хоч виконання зобов’язань не зашкодить (насправді, мабуть, допомагає - див. Нижче), якщо ви не дбаєте про скасування .
sqlalchemy використовує слабкі посилання на об'єкти, які були розмиті: https://docs.sqlalchemy.org/en/13/orm/session_state_management.html#session-referencing-behavior
Це означає, що якщо у вас немає об’єкта, який явно десь тримається, наприклад, у списку чи диктаті, sqlalchemy не збереже його в пам'яті.
Однак тоді у вас є база даних, про яку потрібно турбуватися. Імовірно, змивання без вчинення зобов'язань передбачає певну штрафну пам'ять за підтримку транзакції. Знову ж таки, я новачок у цьому, але ось посилання, яке, здається, підказує саме це: https://stackoverflow.com/a/15305650/764365
Іншими словами, коміти повинні зменшити використання пам'яті, хоча, мабуть, тут є компроміс між пам’яттю та продуктивністю. Іншими словами, ви, мабуть, не хочете здійснювати кожну зміну бази даних по одному (з міркувань продуктивності), але занадто довго очікування збільшить використання пам'яті.