2012-08-28 25 views
6

我使用的是ZODB,據我瞭解,它使用pickle來存儲類實例。我正在做一些重構,我想將我的models.py文件分成幾個文件。但是,如果我這樣做,我不認爲pickle將能夠找到類定義,因此將無法加載我已經存儲在數據庫中的對象。處理這個問題的最好方法是什麼?pickle/zodb:如何處理使用類定義移動.py文件?

回答

4

您可以創建別名;因爲一個models.py模塊正在拆分成多個新模塊,所以只能通過將您的類導入舊位置來完成此操作。

這兩種方法都會導致實例泡菜的新副本引用新位置;如果您可以強制在上寫所有移動類的實例,則不需要保留別名。你可以通過在你想要再次寫入的實例上設置_p_changedTrue來實現。

所以,要創建別名,在原來的位置導入您的移動類:

from newmodule1 import MyClass1, MyClass2 
from newmodule2 import MyClass3 

如果你只重命名模塊(所以所有的都在一個新的地點發現了同樣的課程,可能是一套進口本身),你還可以創建舊名稱的sys.modules條目:

import sys 
import newmodule 

sys.modules['full.path.to.old.module] = newmodule 
+0

啊,這似乎是我想要的。因此,加載現有實例時,pickle會查看舊的'models.py',查找類名,並正確加載類,但加載的類實際上將位於新的位置...... clever – Claudiu

+0

@Claudiu:Exactly ,所以當爲這個類寫一個新的pickle時,它會使用新的模塊路徑。 –

1

不幸的是,沒有簡單的解決方案。您可以通過以下模式與重構的人(我的意思是這是在另一個文件/模塊類)轉換您舊式對象

  1. 添加重構的類代碼沒有刪除舊的,那些
  2. 穿行您的數據庫從根開始,用新更換等同所有對象
  3. 壓縮數據庫(這很重要)
  4. 現在你可以從源代碼刪除您老班
+0

贊成我希望沒有做這樣的事情。別名解決方案似乎很有前途... – Claudiu

+0

@Claudiu我不喜歡混疊解決方案,因爲它帶來了混亂的代碼。但它的作品當然是:-) –

3

只要您希望在不執行向新類模型結構的遷移的情況下加載醬菜,您可以在舊model.py的位置內使用重構類的別名導入。

相關問題