Po co spłukiwać, jeśli możesz popełnić?
Jako ktoś nowy w pracy z bazami danych i sqlalchemy, poprzednie odpowiedzi - które flush()
wysyłają instrukcje SQL do bazy danych i commit()
nadal je trwają - nie były dla mnie jasne. Definicje mają sens, ale z definicji nie wynika jasno, dlaczego miałbyś używać koloru zamiast po prostu zatwierdzać.
Ponieważ zatwierdzenie zawsze się opróżnia ( https://docs.sqlalchemy.org/en/13/orm/session_basics.html#committing ), brzmią bardzo podobnie. Myślę, że główną kwestią do podkreślenia jest to, że kolor nie jest trwały i można go cofnąć, podczas gdy zatwierdzenie jest trwałe, w tym sensie, że nie można poprosić bazy danych o cofnięcie ostatniego zatwierdzenia (myślę)
@snapshoe podkreśla, że jeśli chcesz wykonać zapytanie do bazy danych i uzyskać wyniki, które zawierają nowo dodane obiekty, musisz najpierw wyczyścić (lub zatwierdzić, co będzie dla ciebie opróżniać). Być może jest to przydatne dla niektórych osób, chociaż nie jestem pewien, dlaczego miałbyś chcieć spłukać zamiast zatwierdzić (oprócz trywialnej odpowiedzi, że można to cofnąć).
W innym przykładzie synchronizowałem dokumenty między lokalną bazą danych a zdalnym serwerem i jeśli użytkownik zdecydował się anulować, wszystkie dodania / aktualizacje / usunięcia powinny zostać cofnięte (tzn. Brak częściowej synchronizacji, tylko pełna synchronizacja). Podczas aktualizacji jednego dokumentu postanowiłem po prostu usunąć stary wiersz i dodać zaktualizowaną wersję ze zdalnego serwera. Okazuje się, że ze względu na sposób pisania sqlalchemy kolejność operacji podczas zatwierdzania nie jest gwarantowana. Doprowadziło to do dodania zduplikowanej wersji (przed próbą usunięcia starej), co spowodowało, że baza danych nie wykonała unikalnego ograniczenia. Aby obejść ten problem, użyłem flush()
, aby zachować porządek, ale nadal mogłem cofnąć, jeśli później proces synchronizacji się nie powiedzie.
Zobacz mój post na ten temat na stronie: Czy istnieje zamówienie na dodawanie kontra usuwanie podczas zatwierdzania w sqlalchemy
Podobnie, ktoś chciał wiedzieć, czy kolejność dodawania jest zachowywana podczas zatwierdzania, tj. Jeśli dodam, object1
a potem dodam object2
, czy object1
zostanie dodana do bazy danych wcześniej. object2
Czy SQLAlchemy zapisuje kolejność podczas dodawania obiektów do sesji?
Ponownie, tutaj prawdopodobnie użycie flush () zapewniłoby pożądane zachowanie. Podsumowując, jednym z zastosowań flush jest zapewnienie gwarancji zamówień (tak myślę), jednocześnie nadal pozwalając sobie na opcję cofania, której nie zapewnia zatwierdzenie.
Autoflush i Autocommit
Uwaga: można użyć funkcji automatycznego czyszczenia, aby upewnić się, że zapytania działają na zaktualizowanej bazie danych, ponieważ sqlalchemy opróżni się przed wykonaniem zapytania. https://docs.sqlalchemy.org/en/13/orm/session_api.html#sqlalchemy.orm.session.Session.params.autoflush
Autocommit to coś, czego nie do końca rozumiem, ale wygląda na to, że nie zaleca się jego używania:
https://docs.sqlalchemy.org/en/13/orm/session_api.html#sqlalchemy.orm.session.Session.params. automatyczne zatwierdzanie
Zużycie pamięci
Teraz pierwotne pytanie naprawdę chciało wiedzieć o wpływie koloru do zatwierdzenia dla celów pamięci. Ponieważ zdolność do utrzymywania się lub nie jest czymś, co oferuje baza danych (myślę), zwykłe opróżnianie powinno wystarczyć do odciążenia bazy danych - chociaż popełnienie nie powinno zaszkodzić (faktycznie prawdopodobnie pomaga - patrz poniżej), jeśli nie obchodzi cię cofnięcie .
sqlalchemy używa słabego odwołania do obiektów, które zostały opróżnione: https://docs.sqlalchemy.org/en/13/orm/session_state_management.html#session-referencing-behavior
Oznacza to, że jeśli nie masz obiektu gdzieś wyraźnie trzymanego, np. Na liście lub w dykcie, sqlalchemy nie zachowa go w pamięci.
Masz jednak bazę danych rzeczy do zmartwienia. Przypuszczalnie opróżnienie bez popełnienia wiąże się z pewną karą pamięci, aby utrzymać transakcję. Znów jestem nowy, ale tutaj jest link, który sugeruje dokładnie to: https://stackoverflow.com/a/15305650/764365
Innymi słowy, zatwierdzenia powinny zmniejszyć zużycie pamięci, chociaż przypuszczalnie istnieje tutaj kompromis między pamięcią a wydajnością. Innymi słowy, prawdopodobnie nie chcesz zatwierdzać każdej zmiany bazy danych, pojedynczo (ze względu na wydajność), ale zbyt długie oczekiwanie zwiększy użycie pamięci.