basit kod: o delobj ("örneği xxx kalıcıdır değil" sqlalchemy: Devlet Yönetimi, nasıl oturumda bir unserialize örneğini devam etmek gibi
i session.add çalıştı gibi bir hata yükseltmekimport pickle, cPickle
from app import session, redis
class MyObj(DeclarativeBase):
@classmethod
def get(cls,id):
key = cls.__name__+":"+str(id)
cached = redis.get(key)
if cached:
# unserialize to cls instance
return cPickle.loads(cached)
record = session.query(cls).filter(cls.id==id).one()
if record:
# serialize and store to redis
redis.set(key, pickle.dumps(record))
return record
# first time , a normal orm instance returned from session query (uncached)
obj = MyObj.get(1)
# but the next requests, get cached from redis.
# and i want to delete the record
delobj = MyObj.get(1)
session.delete(delobj)
session.commit()
) silmeden önce, Beklemede durumu doğrudur (durum = denetle (delobj)), ancak yine de silmek için çalışmaz. örneklerden
merge()
transfers state from an outside object into a new or already existing instance within a session.
:
müthiş: İlk düzgün nesne devam Öte yandan eğer
! işe yarıyor. ama yük = false kullansaydım. Yük yükseltiyor: yük ile birleştirme() = yanlış seçeneği nesneleri geçici (yani, dağıtılmamış) nesneleri desteklemiyor. load = false ile birleştirmeden önce eşlenen örneklerde tüm değişiklikleri temizleyin(). – GiveMeFive
Bir şekilde, önbelleğinizdeki DB'ye kalıcı olmayan nesneleri önbelleğe almayı başarmışsınız gibi görünüyor. Önbelleğe alınan örneğiniz için birincil anahtar bulamadığında bu hata [session.py] (https://github.com/zzzeek/sqlalchemy/blob/master/lib/sqlalchemy/orm/session.py#L1761) adresinde oluşturulur. ... Bence. [Devlet yönetimi] 'den (http://docs.sqlalchemy.org/en/latest/orm/session_state_management.html): "Geçici - bir oturumda olmayan ve veritabanına kaydedilmeyen bir örnek; veritabanı kimliği. " –
, uygulamanızda iki tane http isteği vardı. eylem eklemek ve eylemi silmek. insert event @ event.listens_for (cls, 'after_insert'), bir kayıt eklendikten sonra otomatik olarak önbelleğe aldım. ve ikinci http isteği, önbellekten (önbelleğe alınmışsa) silme işlemini gerçekleştirir ... ve load = False çalışmaz. Belki de iki farklı http isteğinde çalıştıklarıdır. – GiveMeFive