我正在使用ZODB
,据我所知,它使用pickle
来存储类实例。我正在做一些重构,我想将models.py
文件拆分成几个文件。但是,如果我这样做,我认为pickle
将无法找到类定义,因此无法加载我已存储在数据库中的对象。处理这个问题的最佳方法是什么?
答案 0 :(得分:4)
您可以创建别名;因为一个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
答案 1 :(得分:3)
只要您想在不执行迁移到新类模型结构的情况下使pickle可加载:您可以在旧model.py的位置内使用重构类的别名导入。
答案 2 :(得分:1)
不幸的是,没有简单的解决方案。您可以通过以下架构将旧样式对象转换为重构的(我的意思是在另一个文件/模块中的类)