2010-11-23 13 views
8

Kullandığım python'da küçük bir tasarruf sunucum var bazı hızlı aramalar kullanıyorum. Sunucu, ilk istekte SqlAlchemy üzerinden mysql'i sorgular ve geri gelen tüm nesneleri bir sözlükte toplar, böylece sonraki istekler için herhangi bir DB çağrısı gerekmez. Sadece nesneyi dict'ten alıyorum ve sonra uygun cevabı vermek için gerekli olan bazı nesne yöntemlerini çağırıyorum.SqlAlchemy ile sorun - "Ana örnek <SomeClass> bir oturuma bağlı değil; tembel yükleme işlemi ..."

Başlangıçta her şey yolunda. Sunucu bir süre çalıştıktan sonra sqlalchemy nesne yöntemleri erişirken Ancak, bu durum alıyorum:

Veli örneği Bir Oturumun bağlı değildir; 'rate' özelliğinin tembel yükleme işlemi devam edemez. Garip

, ben eagerload('rate') set çünkü.

Bu davranışa bir desen göremiyorum, sadece bazı nesneleri etkiler. Ancak, bir nesneyi etkilediğinde, python sunucumu yeniden başlatana kadar her istekte bunu yapmaya devam edecektir.

Herhangi bir fikrin var mı?

+0

İstenilen "oran" özelliğinin çağrılarından birinde fark ettim, hevesli bir şekilde farklı bir arama yolu kullanıyorum, bu yüzden bunu değiştirdim ve fark yaratıp açmadığını göreceğim. – Tony

+0

fark yarattı mı? –

+1

Hız nasıl tanımlanır? Bir sa.orm.relasyon mu? Belki bir örnek kod yazabiliriz. –

cevap

7

Muhtemelen, istekler arasında nesneleri önbelleğe alabilirsiniz ve işlem gerçekleştiğinde, nesnelerinizi geçersiz kılarak oturum nesnesi siliniyor. Sunucunuzu, işçileri gerektiği gibi başlatan bazı çok iş parçacıklı web sunucusu aracılığıyla başlatırsanız, bu durum neden desen olmadığını açıklar. Bu alt almak istiyorum ve sadece hızlı bir düzeltme ihtiyacım yoksa , bu her zaman çalışır:

if obj not in session: 
    obj = session.query(ObjClass).get(obj.id) 

uygun çözümü istekler arasında önbelleğe nesneleri yapmak emin olacaktır.

+0

Yup. Benim durumumda, bir kereviz görevinin eşzamanlı olarak çağrılması ve nesnenin ilkel tip yerine bir parametre olarak geçmesi olgusu idi. Kereviz, farklı bir uygulama ortamında çalışıyordu ve oturum, SQLAlchemy'ı oturum kapsamıyla karıştırdı. Bunu düzeltmek için basitçe '.delay()' ve ilkel değere göre paramları geçirme. – Devy