2011-07-13 8 views
1

私はZODBを使用してキャッシュシステムを作成しています。私がDBに入れているオブジェクトは、__getstate____setstate__のメソッドを使う必要がありました。なぜなら、文字列に変換してBlobに格納するイメージが含まれているからです。ZODBトランザクションコミットは__getstate__を複数回呼び出します

私は似たような問題を抱えている人が見つかりませんでしたので、私は何か愚かなことをやっていると仮定しています。あなたは出力からわかるように、各トランザクションは、すべての以前のためのGETSTATEメソッドを呼び出し

Creating tests... 
Connecting to database... 
Adding tests to db... 
Starting transaction of idx 0 
Entering getstate for 0 
Starting transaction of idx 1 
Entering getstate for 0 
Entering getstate for 1 
Starting transaction of idx 2 
Entering getstate for 0 
Entering getstate for 1 
Entering getstate for 2 

:その結果

from ZODB import FileStorage, DB 
from persistent.mapping import PersistentMapping 
import transaction 

class Test(object): 
    def __init__(self, a): 
     self.a = a 

    def __getstate__(self): 
     print "Entering getstate for %s" % self.a 
     return self.__dict__.copy() 

    def __setstate__(self, state): 
     print "Entering setstate for %s" % state["a"] 
     self.__dict__ = state 

print "Creating tests..." 
tests = [ Test(i) for i in range(3) ] 

print "Connecting to database..." 
storage = FileStorage.FileStorage("./test_db.fs", blob_dir="./test_blobs") 
db = DB(storage) 
conn = db.open() 
root = conn.root() 
root["cache"] = PersistentMapping() 
transaction.commit() 

print "Adding tests to db..." 
for idx,t in enumerate(tests): 
    print "Starting transaction of idx %d" % idx 
    root["cache"][idx] = t 
    transaction.commit() 

:私がいる問題は、次のテストコードを実行することで見ることができますトランザクション。これは起こるはずですか/私は何が欠けていますか?私はトランザクションの使用を完全に誤解していますか?そのようなPersistentMappingsを使用しても問題ありませんか?

私はZODB 3.10.3とPython 2.6.3を使用しています。

P.S. 私は通常、すべての操作を実行した後にコミットを行うことはわかっていますが、このループは、ZODBからデータを追加または取得する「キャッシュ」オブジェクトで可能な一連のメソッド呼び出しを表しています。

ご協力いただきありがとうございます。追加の研究とテストの時間と時間後

答えて

1

は、ここに自分の質問に私の答えだ...

簡単な答えは、あなたがpersistent.Persistentからサブクラス化しなければならないです。

は、私はこれをやって避けたかった(と私はしかし、私は私が行っていた研究の一部からできた)ので、カスタム __getstate____setstate__のための私の必要性の私は、永続的な継承私がいくつかの余分な作業をしなければならないだろうと思いましたそれが正しく動作するようにしてください。私が保管しているオブジェクトが後で変更された場合は問題はありますが、問題はあるかもしれません(しかし、ZODBにいったん変更しても問題ありません)。

もし私がこれをやっている方法について他のアドバイスや警告がありましたら、それは大歓迎です。あなたが提供できるものをありがとう。

関連する問題