sessionmaker()
bir fabrika, yeni Session
nesneler oluşturmak için yapılandırma seçeneklerini tek bir yere yerleştirmeyi teşvik etmek için var . Opsiyoneldir, çünkü Session(bind=engine, expire_on_commit=False)
yenisine ihtiyaç duyduğunuz her an kolayca arayabilirdiniz Session
, ancak bunun ayrıntılı ve gereksiz olması dışında ve küçük ölçekli "yardımcıların" çoğalmasını durdurmak istedim, her biri bu artıklık konusuna yeni bir şekilde yaklaştı. ve daha kafa karıştırıcı bir yol.
Bu sessionmaker()
, Session
ihtiyaç duyduğunuzda nesneler oluşturmanıza yardımcı olacak bir araçtır .
Sonraki bölüm. Bence asıl soru, Session()
çeşitli noktalarda yeni bir şeyler yapmak ile tamamen birini kullanmak arasındaki fark nedir ? Cevap çok değil. Session
içine koyduğunuz tüm nesneler için bir kaptır ve ardından açık bir işlemi de izler. rollback()
Veya aradığınız anda commit()
işlem bitmiştir ve Session
SQL'i yeniden yayması çağrılana kadar veritabanına bağlantısı yoktur. Eşlenen nesnelerinize tuttuğu bağlantılar, nesnelerin bekleyen değişikliklerden temiz olması koşuluyla, zayıf referans niteliğindedir; bu nedenle, bu bağlamda bile Session
, uygulamanız eşlenen nesnelere olan tüm referansları kaybettiğinde kendisini yepyeni bir duruma geri boşaltır. Varsayılanı ile bırakırsan"expire_on_commit"
ayarlandığında, tüm nesnelerin süresi bir işlemden sonra sona erer. Bu Session
beş veya yirmi dakika boyunca takılırsa ve veritabanında her türlü şey değiştiyse, bir dahaki sefere bu nesnelere eriştiğinizde bellekte oturuyor olsalar bile tüm yepyeni durumları yükleyecektir. yirmi dakika için.
Web uygulamalarında, biz genellikle deriz ki, hey neden Session
her istek üzerine aynı şeyi tekrar tekrar kullanmak yerine yepyeni bir şey yapmıyorsunuz . Bu uygulama, yeni isteğin "temiz" başlamasını sağlar. Önceki istekte bulunan bazı nesneler henüz çöp toplanmadıysa ve belki kapattıysanız "expire_on_commit"
, belki önceki istekten gelen bazı durumlar hala ortalıkta dolaşıyor ve bu durum oldukça eski bile olabilir. Açık bırakmaya expire_on_commit
ve kesinlikle aramayı commit()
ya rollback()
da istek sonunda yapmaya dikkat ediyorsanız , sorun değil, ancak yepyeni biriyle başlarsanız Session
, o zaman temiz başladığınıza dair herhangi bir soru bile yoktur. Dolayısıyla, her isteği yeni birSession
expire_on_commit
bu commit()
, bir dizi işlemin ortasında çağıran bir işlem için fazladan SQL'e neden olabileceğinden , gerçekten de yeni bir başlangıç yaptığınızdan emin olmanın ve hemen hemen isteğe bağlı kullanım yapmanın en basit yoludur . Sorunuzun cevabının bu olduğundan emin değilim.
Sonraki tur, iplik geçirme hakkında bahsettiğiniz şey. Uygulamanız çok iş parçacıklıysa, Session
kullanımda olanın yerel bir şey olduğundan emin olmanızı öneririz . scoped_session()
varsayılan olarak mevcut iş parçacığı için yerel yapar. Bir web uygulamasında, istek için yerel olan aslında daha da iyidir. Flask-SQLAlchemy aslında scoped_session()
, istek kapsamlı bir oturum alabilmeniz için özel bir "kapsam işlevi" gönderir . Ortalama bir Piramit uygulaması, Oturumu "istek" kaydına yapıştırır. Bunun gibi şemaları kullanırken, "istek başladığında yeni Oturum oluştur" fikri, işleri yoluna koymanın en basit yolu gibi görünmeye devam eder.