7

私がZODB理解しているように、pickleクラスインスタンスを格納するために使用しています。models.pyファイルを複数のファイルに分割するために、少しリファクタリングを行っています。ただし、これを行うとpickle、クラス定義を見つけることができないため、データベースに既に保存しているオブジェクトをロードできなくなると思います。この問題を処理する最善の方法は何ですか?

4

3 に答える 3

5

エイリアスを作成できます。1 つのmodels.pyモジュールが複数の新しいモジュールに分割されているため、クラスを古い場所にインポートすることによってのみこれを行うことができます。

どちらの方法でも、インスタンスのピクルの新しいコピーが新しい場所を参照します。移動したクラスのすべてのインスタンスに書き込みを強制できる場合は、エイリアスを保持する必要はありません。これを行うには、再度書き込みたいインスタンスに を設定_p_changedします。True

したがって、エイリアスを作成するには、移動したクラスを古い場所にインポートします。

from newmodule1 import MyClass1, MyClass2
from newmodule2 import MyClass3

モジュールの名前を変更するだけの場合(同じクラスがすべて 1 つの新しい場所にあり、インポート自体のセットである可能性があります)、sys.modules古い名前のエントリを作成することもできます。

import sys
import newmodule

sys.modules['full.path.to.old.module] = newmodule
于 2012-08-28T17:15:43.413 に答える
3

新しいクラスモデル構造への移行を実行せずにpickleをロード可能にしたい場合は、古いmodel.pyの場所内でリファクタリングされたクラスのエイリアスインポートを使用できます。

于 2012-08-28T17:10:28.570 に答える
1

残念ながら、簡単な解決策はありません。次のスキーマによって、古いスタイルのオブジェクトをリファクタリングされたオブジェクト (別のファイル/モジュールにあるクラスを意味します) に変換できます。

  1. 古いクラスを削除せずに、リファクタリングされたクラスをコードに追加します
  2. ルートから始めてDBをたどり、すべての古いオブジェクトを新しい同等のものに置き換えます
  3. データベースを圧縮します (これは重要です)
  4. ソースから古いクラスを削除できるようになりました
于 2012-08-28T17:06:07.543 に答える