2011-10-06 6 views
6

Al actualizar una aplicación GAE, ¿cuál es la mejor manera de actualizar el modelo de datos?Transición de datos en múltiples versiones de aplicación

El número de versión de la aplicación permite separar varias versiones, pero estas versiones de aplicación utilizan el mismo almacén de datos (según How to change application after deployed into Google App Engine?). Entonces, ¿qué sucede cuando cargo una versión de la aplicación con un modelo de datos diferente (estoy pensando en Python aquí, pero la pregunta también debería ser válida para Java)? Supongo que no debería ser un problema si los cambios agregan un campo anulable y algunas clases nuevas, por lo que el modelo existente se puede extender sin daño. Pero, ¿qué pasa si los cambios en el modelo de datos son más profundos? ¿De verdad pierdo los datos existentes si se vuelve inconsistente con el nuevo modelo de datos?

La única opción que veo por el momento es poner el almacén de datos en modo de solo lectura de mantenimiento, transformar los datos fuera de línea e implementar todo de nuevo.

Respuesta

6

Hay pocas formas de tratar con eso y que no son mutuamente excluyentes:

  • Hacer un cambio de no separación a su almacén de datos y el trabajo en torno a los problemas que crea. Insertar nuevos campos en clases de modelos existentes, cambiar los campos de requerido a opcional, agregar nuevos modelos, etc., esto no romperá la compatibilidad con ninguna entidad existente. Pero dado que esas entidades no cambian mágicamente para ajustarse al nuevo modelo (recuerde, el almacén de datos es una base de datos sin esquema), es posible que necesite un código heredado que sea parcialmente compatible con el modelo anterior. Por ejemplo, si ha agregado un nuevo campo, querrá acceder a él a través del getattr(entity, "field_name", default_value) en lugar de entity.field_name para que no resulte en AttributeError para entidades antiguas.
  • Gradualmente convierta las entidades a un nuevo formato. Esto es bastante simple: si encuentra una entidad que aún usa el modelo anterior, realice los cambios apropiados. En el ejemplo anterior, se quiere poner la entidad de vuelta con que se añade nuevo campo:

    if not hasattr(entity, "field_name"): 
        entity.field_name = default_value 
        entity.put() 
    val = entity.field_name # no getattr'ing needed now 
    

    ideal sería que todos sus entidades será finalmente procesado en la forma y usted será capaz de eliminar el código de conversión en algún punto. En realidad, siempre habrá algunos restos que se deben convertir manualmente, y esto nos lleva a la opción número tres ...

  • Convierta por lotes sus entidades a un nuevo formato. La complejidad de la logística depende de la cantidad de entidades a procesar, la actividad de su sitio, los recursos que puede dedicar al proceso, etc. Solo tenga en cuenta que el uso directo de MapReduce puede no ser la mejor idea, especialmente si utilizó la conversión gradual. técnica descrita arriba. Esto se debe a que MapReduce procesa todas las entidades del tipo dado (buscándolas) mientras que solo puede haber un pequeño porcentaje que lo necesite. Por lo tanto, podría ser beneficioso codificar el código de conversión a mano, escribiendo explícitamente la consulta para entidades antiguas y p. usando una biblioteca tal como ndb.
Cuestiones relacionadas