ZODB
据我了解,我正在使用它pickle
来存储类实例。我正在做一些重构,我想将我的models.py
文件分成几个文件。但是,如果我这样做,我认为pickle
将无法找到类定义,因此将无法加载我已经存储在数据库中的对象。处理这个问题的最佳方法是什么?
问问题
720 次
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
不幸的是,没有简单的解决方案。您可以通过以下模式将旧式对象与重构对象(我的意思是在另一个文件/模块中的类)转换
- 将重构的类添加到您的代码中而不删除旧的类
- 从根开始遍历您的数据库并用新的等价物替换所有旧对象
- 压缩你的数据库(这很重要)
- 现在您可以从源代码中删除旧课程
于 2012-08-28T17:06:07.543 回答