Taahhüt edebiliyorsanız neden yıkayın?
Veritabanları ve sqlalchemy ile çalışmaya yeni başlayan biri flush()
olarak, DB'ye SQL ifadeleri gönderen ve commit()
onları devam ettiren önceki cevaplar bana açık değildi. Tanımlar mantıklıdır, ancak sadece taahhüt etmek yerine neden bir floş kullanacağınız tanımlarından hemen net değildir.
Bir taahhüt her zaman temizlendiğinden ( https://docs.sqlalchemy.org/en/13/orm/session_basics.html#committing ) bu ses gerçekten benzer. Vurgulamak için büyük bir sorun, bir floş kalıcı değildir ve geri alınabilir, oysa bir taahhüt kalıcıdır, yani veritabanından son taahhüdü geri almasını isteyemezsiniz (sanırım)
@snapshoe, veritabanını sorgulamak ve yeni eklenen nesneler içeren sonuçlar almak istiyorsanız, önce temizlenmiş olmanız (veya sizin için kızarma işleminde bulunmanız gerekir) vurgulamaktadır. Belki de bazı insanlar için yararlıdır, ancak taahhüt etmek yerine neden yıkamak isteyeceğinizden emin değilim (geri alınabileceği önemsiz cevap dışında).
Başka bir örnekte, belgeleri yerel bir DB ile uzak sunucu arasında senkronize ediyordum ve kullanıcı iptal etmeye karar verdiyse, tüm ekleme / güncelleme / silme işlemleri geri alınmalıdır (yani kısmi senkronizasyon yok, sadece tam senkronizasyon yok). Tek bir belgeyi güncellerken eski satırı silmeye ve güncellenmiş sürümü uzak sunucudan eklemeye karar verdim. Sqlalchemy'nin yazılma şekli nedeniyle, taahhütte bulunurken işlem sırasının garanti edilmediği ortaya çıkıyor. Bu, yinelenen bir sürümün (eski sürümü silmeye çalışmadan önce) eklenmesiyle sonuçlandı, bu da DB'nin benzersiz bir kısıtlamanın başarısız olmasına neden oldu. Bu sorunu gidermek için flush()
, sipariş korunur, ancak daha sonra senkronizasyon işlemi başarısız olursa geri alabilirdim.
Bu konudaki yazımı görün: sqlalchemy'de taahhütte bulunma yerine silme siparişi var mı
Benzer şekilde, birisi eklenti sırası işlemekle, ben eklemek eğer yani korunur olmadığını bilmek istiyordu object1
sonra ekleyin object2
, yok object1
önce veritabanına eklenen olsun object2
sipariş tasarruf mu sqlalchemy oturumuna nesneleri eklerken?
Yine, burada muhtemelen bir flush () kullanımı istenen davranışı sağlayacaktır. Yani özet olarak, floş için bir kullanım, yine kendinize taahhüt sağlamayan bir "geri al" seçeneğine izin verirken, sipariş garantileri (sanırım) sağlamaktır.
Otomatik Yıkama ve Otomatik Kapatma
Otomatik yıkama, sorguların güncellenmeden önce sorguların güncellenmesini sağlamak için kullanılabilir, çünkü sqlalchemy sorguyu yürütmeden önce temizlenir. https://docs.sqlalchemy.org/en/13/orm/session_api.html#sqlalchemy.orm.session.Session.params.autoflush
Otomatik tamamlama, tam olarak anlamadığım başka bir şey ama kullanımı önerilmez:
https://docs.sqlalchemy.org/en/13/orm/session_api.html#sqlalchemy.orm.session.Session.params. autocommit
Hafıza kullanımı
Şimdi asıl soru aslında bellekte yıkamanın yerine getirmenin etkilerini bilmek istiyordu. Kalıcı ya da değil yeteneği veritabanı sunduğu bir şey (sanırım), geri alma umurumda değil eğer sadece taahhüt veri tabanına boşaltmak için yeterli olmalıdır - taahhüt rağmen zarar (aslında muhtemelen yardımcı olur - aşağıya bakın) .
sqlalchemy temizlenmiş nesneler için zayıf referans kullanır: https://docs.sqlalchemy.org/en/13/orm/session_state_management.html#session-referencing-behavior
Bu, bir liste veya dikte gibi açıkça bir yerde tutulan bir nesneniz yoksa, sqlalchemy onu hafızada tutmayacaktır.
Ancak, o zaman endişelenecek şeylerin veritabanı tarafı var. Muhtemelen işlemeden yıkama, işlemi sürdürmek için bazı hafıza cezaları ile birlikte gelir. Yine, bu konuda yeniyim ama tam olarak bunu öneren bir bağlantı var: https://stackoverflow.com/a/15305650/764365
Başka bir deyişle, taahhütler bellek kullanımını azaltmalıdır, ancak muhtemelen burada bellek ve performans arasında bir denge vardır. Başka bir deyişle, muhtemelen her bir veritabanı değişikliğini tek tek yapmak istemezsiniz (performans nedenleriyle), ancak çok uzun süre beklemek bellek kullanımını artıracaktır.