7

ZODB据我了解,我正在使用它pickle来存储类实例。我正在做一些重构,我想将我的models.py文件分成几个文件。但是,如果我这样做,我认为pickle将无法找到类定义,因此将无法加载我已经存储在数据库中的对象。处理这个问题的最佳方法是什么?

4

3 回答 3

5

您可以创建别名;因为一个models.py模块被拆分为多个新模块,您只能通过将类导入旧位置来做到这一点。

这两种方法都会导致您的实例泡菜的新副本引用新位置;如果您可以强制写入已移动类的所有实例,则无需保留别名。您可以通过在要再次写入的实例上设置_p_changed为来做到这一点。True

因此,要创建别名,请将您移动的类导入旧位置:

from newmodule1 import MyClass1, MyClass2
from newmodule2 import MyClass3

如果您只重命名一个模块(因此相同的类都可以在一个新位置找到,可能是一组导入本身),您还可以为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. 从根开始遍历您的数据库并用新的等价物替换所有旧对象
  3. 压缩你的数据库(这很重要)
  4. 现在您可以从源代码中删除旧课程
于 2012-08-28T17:06:07.543 回答