2

初めてZODBを使用しています。FileStorageでデータをコミットしようとしているだけです。しかし、同じスクリプトを2回実行すると、新しいオブジェクトをコミットできません。これが私のスクリプトです

from ZODB import FileStorage,DB
import transaction    
storage = FileStorage.FileStorage('/tmp/test.fs')
db = DB(storage)
conn = db.open()
root = conn.root()
#root['layer']={}
root['layer']['2b']={"id":'2b','name':'some name'}
transaction.commit()
conn.close()
db.close()
storage.close()

root['layer']['2c']IDを変更してPythonから出ただけで、コードをもう一度繰り返すと、2回目のオブジェクトがコミットされません。私は最初のオブジェクトしか持っていません。その理由は何でしょうか。

4

2 に答える 2

5

ZODB永続性レイヤーは、Python__setattr__フックにフックすることで変更を検出し、属性を設定するたびに永続オブジェクトを変更済みとしてマークします。

ただし、Pythonディクショナリのようなプリミティブな可変オブジェクトを使用する場合、属性が書き込まれていないため、永続化機構が変更を検出する方法はありません。これを回避するには、次の3つのオプションがあります。

永続的なマッピングを使用する

永続パッケージには永続マッピングクラスが含まれています。これは基本的に永続的なPythonディクショナリの実装であり__setitem__、他のマッピングフックにフックすることで変更を直接検出します。このroot例のオブジェクトは、基本的に永続的なマッピングです。

使用するには、すべての辞書を永続的なマッピングに置き換えるだけです。

from persistent.mapping import PersistentMapping
root['layer'] = PersistentMapping()

フックをトリガーして変更を強制的に検出します

キーを再設定するか、永続オブジェクトで属性を再設定して、オブジェクトを強制的に変更することができます。

root['layer'] = root['layer']

永続オブジェクトに変更済みのフラグを立てます

_p_changed最も近い永続オブジェクトにフラグを設定できます。ルートオブジェクトはあなたが持っている唯一の永続オブジェクトであり、他はすべてPythonディクショナリであるため、変更済みとしてフラグを立てる必要があります。

root._p_changed = 1
于 2011-04-18T17:31:38.327 に答える
0

あなたはおそらく行方不明です

root['layer']._p_changed = 1

口述を変更した後。

http://zodb.org/documentation/guide/prog-zodb.html?highlight=_p_changed#modifying-mutable-objects

于 2011-04-18T14:48:56.943 に答える