2012-08-28 16 views
6

Estoy usando ZODB que, según tengo entendido, usa pickle para almacenar instancias de clase. Estoy haciendo un poco de refactorización donde quiero dividir mi archivo models.py en varios archivos. Sin embargo, si hago esto, no creo que pickle pueda encontrar las definiciones de clase, y por lo tanto no podrá cargar los objetos que ya he almacenado en la base de datos. ¿Cuál es la mejor manera de manejar este problema?pickle/zodb: cómo manejar archivos .py en movimiento con definiciones de clase?

Respuesta

4

Puede crear alias; debido a que un módulo models.py se está dividiendo en múltiples módulos nuevos, solo puede hacerlo al importar sus clases a la ubicación anterior.

Ambos métodos provocan que las copias nuevas de los encuadres de su instancia se refieran a la nueva ubicación; Si puede forzar una escritura en todas las instancias de las clases movidas, no necesita conservar los alias. Puede hacer esto configurando _p_changed en True en sus instancias que desea que se vuelvan a escribir.

Por lo tanto, para crear los alias, importar sus clases movido en la antigua ubicación:

from newmodule1 import MyClass1, MyClass2 
from newmodule2 import MyClass3 

Si sólo cambiar el nombre un módulo (lo que las mismas clases todos se encuentran en una nueva ubicación, podría ser un conjunto de ellos mismos importaciones), también puede crear una entrada de sys.modules para el antiguo nombre:

import sys 
import newmodule 

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

ah, esto parece ser lo que quiero. Así que pickle, al cargar las instancias existentes, se verá en el antiguo 'models.py', encontrará el nombre de clase, y cargará la clase correctamente, pero la clase cargada estará realmente en la nueva ubicación ... inteligente – Claudiu

+0

@Claudiu: Exactamente , por lo tanto, al escribir un nuevo pickle para la clase, usará la nueva ruta del módulo. –

1

Desafortunadamente, no hay una solución fácil. Usted puede convertir sus objetos de estilo antiguo con las refactorizado queridos (me refiero a las clases que se encuentran en otro archivo/módulo) por el siguiente esquema

  1. añadir las clases refactorizado a su código sin eliminación de los viejos-unos
  2. paseo a través de su base de datos a partir de la raíz y la sustitución de todos los objetos antiguos con nuevos equivalentes
  3. comprimir su base de datos (que es importante)
  4. ahora se puede quitar sus viejas clases de las fuentes
+0

sí tenía la esperanza de no tener que hacer algo así. la solución de alias parece prometedora ... – Claudiu

+0

@Claudiu No me gusta la solución de aliasing ya que trae desorden en el código. Pero funciona, por supuesto :-) –

3

Siempre que desee que el pickle se pueda cargar sin realizar una migración a la nueva estructura de modelo de clase: puede usar importaciones de alias de las clases refactorizadas dentro de la ubicación del antiguo model.py.

Cuestiones relacionadas