einfacher Code bestehen wie:sqlalchemy: State Management, wie eine unserialize Instanz in der Sitzung
import 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()
es einen Fehler wie erhöhen "Instanz xxx wird nicht beibehalten"
ich versuchte session.add (DELOBJ) vor dem Löschen ist der Zustand Pending True (state = inspect (delobj)), funktioniert aber immer noch nicht zum Löschen.
awesome! Es klappt. aber wenn ich load = False verwendet. es wirft Fehler auf: merge() mit load = False-Option unterstützt Objekte nicht transient (d. h. nicht übergeordnete) Objekte. flush() alle Änderungen an gemappten Instanzen vor dem Zusammenführen mit load = False. – GiveMeFive
Es scheint, dass Sie es irgendwie geschafft haben, Objekte, die nicht persistent in der DB in Ihrem Cache gespeichert wurden, zwischenzuspeichern. Der Fehler wird in [session.py] (https://github.com/zzzeek/sqlalchemy/blob/master/lib/sqlalchemy/orm/session.py#L1761) ausgelöst, wenn kein Primärschlüssel für die zwischengespeicherte Instanz gefunden werden kann ... Ich denke. Von [Statusverwaltung] (http://docs.sqlalchemy.org/en/latest/orm/session_state_management.html): "Transient - Eine Instanz, die sich nicht in einer Sitzung befindet und nicht in der Datenbank gespeichert ist, dh sie hat keine Datenbankidentität. " –
gab es zwei http-Anfrage in meiner App. Aktion einfügen und Aktion löschen ich habe das insert-Ereignis @ event.listens_for (cls, 'after_insert') gehört, automatisch zwischengespeichert, nachdem ein Datensatz eingefügt wurde. und die zweite HTTP-Anfrage, die Instanz aus dem Cache holen (wenn zwischengespeichert wird), um sie zu löschen ... und load = False funktioniert nicht. Vielleicht liegt es daran, dass sie in zwei verschiedenen http-Anfragen arbeiten. – GiveMeFive