2011-02-16 9 views
5

He cambiado mi objeto para tener una nueva propiedad requerida en v2. Cuando intento buscar un objeto v1 desde el almacén de datos, obtengo BadValueError porque v1 no tiene la propiedad requerida. Cuál es la mejor manera de introducir nuevas propiedades requeridas en los datos existentesCómo introducir la propiedad requerida en GAE

+0

Como una adición a otras respuestas, si hay un valor predeterminado sensato, simplemente puede configurar eso en el modelo, lo que evitará errores. –

Respuesta

6

Resolvería este problema usando la biblioteca mapreduce.

En primer lugar, registrar el asignador de mapreduce.yaml:

mapreduce: 
- name: fixing required property 
    mapper: 
    input_reader: mapreduce.input_readers.DatastoreInputReader 
    handler: your handler 
    params: 
    - name: entity_kind 
     default: main.ModelV2 

continuación, definir una función process para modificar las entidades:

from mapreduce import operation as op 
def process(entity): 
if not entity.newproperty : 
    entity.newproperty = None 
yield op.db.Put(entity) 

Si usted está tratando con un número relativamente pequeño de entidades, usted podría evite mapreduce modificando directamente sus entidades con algo como esto:

entities = ModelV2.all() 
for entity in entities : 
    if not entity.newproperty : 
    entity.newproperty = None 
    entity.put() 
3

Tendrá que agregarlo como una propiedad opcional para su modelo, buscar cada entidad existente, agregarle la propiedad (generando un valor razonable de alguna manera), luego put() la entidad. Una vez que todas sus entidades existentes hayan sido "actualizadas", puede hacer que la propiedad sea requerida.

La API de mapreduce de AppEngine debería hacer esto bastante fácil.

Cuestiones relacionadas