pickle / zodb:如何处理带有类定义的移动.py文件?

时间:2012-08-28 16:50:07

标签: python refactoring pickle zodb

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

3 个答案:

答案 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)

不幸的是,没有简单的解决方案。您可以通过以下架构将旧样式对象转换为重构的(我的意思是在另一个文件/模块中的类)

  1. 将重构的类添加到代码,而不用删除旧的
  2. 从根开始遍历您的数据库,并用新的等价物替换所有旧对象
  3. 压缩您的数据库(这很重要)
  4. 现在您可以从源
  5. 中删除旧类