簡単なコード:それはDELOBJ(「インスタンスxxxは保持されません」 SQLAlchemyの:状態管理には、どのセッションでアンシリアライズインスタンスを永続化するよう
iはsession.addしようとしたようにエラーが発生し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()
)を削除する前に、ペンディング状態はTrue(状態= inspect(delobj))ですが、それでも削除できません。例から
merge()
transfers state from an outside object into a new or already existing instance within a session.
:
素晴らしい:あなたが最初に適切にオブジェクトを永続化する一方場合
!できます。しかし、私はload = Falseを使用しています。 Error:merge()with load = Falseオプションは、オブジェクトの一時的(すなわち、固定されていない)オブジェクトをサポートしません。 load = Falseとマージする前に、マップされたインスタンスのすべての変更をflush()します。 – GiveMeFive
キャッシュ内のDBに永続化されていないオブジェクトを何らかの形でキャッシュすることができたようです。キャッシュされたインスタンスの主キーが見つからない場合、[session.py](https://github.com/zzzeek/sqlalchemy/blob/master/lib/sqlalchemy/orm/session.py#L1761)でエラーが発生します... おもう。 [State management](http://docs.sqlalchemy.org/en/latest/orm/session_state_management.html)から: "Transient - セッションにはなく、データベースに保存されていないインスタンス、つまり、データベースのアイデンティティ。 –
私のアプリには2つのhttpリクエストがありました。アクションを挿入し、アクションを削除します。私はレコードを挿入した後に自動的にキャッシュされた@ event.listens_for(cls、 'after_insert')の挿入イベントを聴いています。 2番目のhttpリクエストでは、キャッシュからインスタンスを取得して(キャッシュされている場合)、それを削除します。... load = Falseは機能しません。たぶん理由は2つの異なるhttp要求で動作するということです。 – GiveMeFive