2011-05-16 12 views
8

Tengo una clase persistente almacenada en un almacén de datos GAE. He eliminado uno de los atributos de la clase. Los nuevos registros en esta tabla muestran un valor <none> para el atributo eliminado. Pero, ¿hay alguna manera de poder eliminar completamente esta columna de la mesa?Cómo eliminar una columna (atributo) de un almacén de datos GAE?

Gracias.

Agregado el siguiente código 'migración' de acuerdo con la sugerencia de Moraes, pero no está logrando el resultado deseado:

PersistenceManager pm = PMF.get().getPersistenceManager(); 
try { 
    Query q = pm.newQuery(UserLogin.class); 
    Collection<UserLogin> list = (Collection<UserLogin>) q.execute(); 

    Iterator<UserLogin> iter = list.iterator(); 
    while (iter.hasNext()) { 
     UserLogin obj = (UserLogin) iter.next(); 
     obj.setLoginDate(obj.getLoginDate()); 
    } 

    pm.makePersistentAll(list); 

} finally { 
    pm.close(); 
} 

Respuesta

6

he encontrado la respuesta a este problema en el presente artículo: http://code.google.com/appengine/articles/update_schema.html

"Extracción Suprimido Propiedades en el almacén de datos

Si elimina una propiedad de su modelo, se encuentra que las entidades existentes todavía tener la propiedad. Se mostrará en la consola de administración y seguirá presente en el almacén de datos. Para eliminar realmente los datos antiguos, debe pasar por sus entidades y eliminar los datos de cada uno.

  • Asegúrese de haber eliminado las propiedades de la definición del modelo.

  • Si su clase de modelo hereda de db.Model, cambie temporalmente a heredar de db.Expando. (db.Las instancias de modelo no se pueden modificar dinámicamente, que es lo que tenemos que hacer en el siguiente paso).

  • Realice un ciclo a través de las entidades existentes (como se describe arriba). Para cada entidad, use delattr para eliminar la propiedad obsoleta y luego guarde la entidad.

  • Si su modelo se ha heredado originalmente de db.Model, no olvide volver a cambiarlo después de actualizar todos los datos."

Y aquí es un ejemplo de código: http://sandrylogan.wordpress.com/2010/12/08/delattr/

5

No existe el concepto de 'mesa' en el almacén de datos. Cada entidad puede tener propiedades arbitrarias que no siguen un esquema común. El único "esquema" está en su código modelo, y los registros existentes no cambian automáticamente cuando cambia sus modelos.

Por lo tanto, para eliminar la propiedad de los registros existentes, debe recorrer todos los registros y volver a guardarlos sin la propiedad.

+0

moraes - gracias por su ayuda. Por favor, consulte el código de 'migración' en mi OP. Mi clase UserLogin es la clase persistente y el campo no deseado se ha eliminado de ella. Pero de alguna manera sigo viendo ' debajo de las entradas antiguas en el almacén de datos. ¿Me he perdido algo? – DFB

+0

Debe llamar a pm.makePersistentAll() pasando las entidades modificadas, para guardarlas y excluir efectivamente la propiedad adicional que ya no existe. – moraes

+0

Agregué esa llamada al método, pero no hubo diferencia. Ver el código actualizado en mi OP. Todavía veo ' para los valores de la propiedad eliminada. Gracias. – DFB

3

El visualizador del almacén de datos obtiene su lista de columnas de las estadísticas del almacén de datos, que se actualizan con regularidad. Si eliminó esa columna de cada entidad que la tenía, espere uno o dos días y el visor del almacén de datos dejará de mostrarla.

7

Si está utilizando ndb (y probablemente debería), puede eliminar fácilmente las propiedades de eliminarlos de entity._properties:

for entity in MyModel.query(): 
    if 'old_property' in entity._values: 
     del entity._properties['old_property'] 
     del entity._values['old_property'] 
     entity.put() 

O puede hacerlo más rápido utilizando asynchronousquery map:

@ndb.tasklet 
def cleanup(entity): 
    if 'old_property' in entity._values: 
     del entity._properties['old_property'] 
     del entity._values['old_property'] 
     yield entity.put_async() 

MyModel.query().map(cleanup) 
+0

hey, creo que los "eliminar" deberían ser "del" s, pero esto funcionó muy bien para mí, gracias. –

+0

@RyanBavetta ¡Gracias, corregido! –

Cuestiones relacionadas