SORU
17 Kasım 2010, ÇARŞAMBA


SQLAlchemy:'floş arasındaki fark Ne() ve commit()?

Kimse fark flush() ve SQLAlchemy commit() arasında ne bana, düz İngilizce söyleyebilir?

Belgeleri okudum, ama ben tam bir bilge - düşünüyorlar öncesi bir anlayış yok.

Bellek kullanımı üzerindeki etkisi ilgimi çekecek. Ben yükleme bazı verileri bir veritabanından bir dizi dosya (yaklaşık 5 milyon satır toplam) ve benim oturum zaman zaman düşme - geniş bir veritabanı ve bir makine ile pek bir bellek.

commit() ve yeterli flush() çok fazla çağrı kullanıyorum merak ediyorum - ama gerçekten farkın ne olduğunu anlamadan, söylemek zor.

Yardımlarınız için teşekkür ederim.

CEVAP
17 Kasım 2010, ÇARŞAMBA


Düzenlenmiş zzzeek yorum yansıtmak için

Oturum nesnesi temelde bir veritabanı değişiklikleri (update, ınsert, delete) devam eden bir işlem. Bu işlemler ise, seansın işlem, kaydedilmemiş değişiklikler içinde bazı nedenlerden dolayı program iptal kayıpsa () bunlar uygulanana kadar veritabanı kalıcı değil.

Oturumu kaydeder session.add() ile işlem nesne ama henüz session.flush() çağrılana kadar bunları veritabanına iletişim kurmak değildir.

session.flush() veritabanı işlemleri (ınsert, update, delete) bir dizi iletişim kurar. Veritabanında bir işlem bekleyen işlemler olarak onları korur. Değişiklikleri veritabanına bir geçerli işlem için TAAHHÜT aldığı kadar kalıcı olarak disk ya da diğer işlemler için görünür kalıcı değil (ne oturumu.() taahhüt etmez).

session.commit() işleyen (devam) veritabanına bu değişiklikleri.

flush()her zamancommit() bir Ara(1)bir parçası olarak.

Veritabanını sorgulamak için nesne Oturumu kullandığınızda, sorgu tutar kaydedilmemiş işlem kızarmış parçaları veritabanından ve sonuçları döndürür. Varsayılan olarak, Oturum nesneleri 11* *operasyonlarını, ama bu devre dışı bırakılabilir.

Umarım bu örnek, bu daha net olur:

#---
s = Session()

s.add(Foo('A')) # The Foo('A') object has been added to the session.
                # It has not been committed to the database yet,
                #   but is returned as part of a query.
print 1, s.query(Foo).all()
s.commit()

#---
s2 = Session()
s2.autoflush = False

s2.add(Foo('B'))
print 2, s2.query(Foo).all() # The Foo('B') object is *not* returned
                             #   as part of this query because it hasn't
                             #   been flushed yet.
s2.flush()                   # Now, Foo('B') is in the same state as
                             #   Foo('A') was above.
print 3, s2.query(Foo).all() 
s2.rollback()                # Foo('B') has not been committed, and rolling
                             #   back the session's transaction removes it
                             #   from the session.
print 4, s2.query(Foo).all()

#---
Output:
1 [<Foo('A')>]
2 [<Foo('A')>]
3 [<Foo('A')>, <Foo('B')>]
4 [<Foo('A')>]

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Alfredo Garcia

    Alfredo Garc

    25 Mayıs 2007
  • Jorrit Jongma

    Jorrit Jongm

    17 Ocak 2008
  • TheForgottenGamer1

    TheForgotten

    28 AĞUSTOS 2009