usa tutorial sobre que para instalar index funciona elastic crear como comandos python google-app-engine app-engine-ndb

python - tutorial - Migración de datos al cambiar el tipo de propiedad de un campo NDB



todo sobre elasticsearch (2)

Cómo enfocar esto dependerá de cuántas entidades tenga. Si un número relativamente pequeño de entidades dice en los 10000, simplemente usaría remote_api y recuperaría los datos subyacentes sin procesar del almacén de datos y manipularía los datos directamente y luego los volvería a escribir, sin usar los modelos. Por ejemplo, esto obtendrá entidades sin formato y se puede acceder a las propiedades como un diccionario. Este código se ha eliminado del código SDK appengine de nivel inferior.

from google.appengine.api import datastore from google.appengine.api import datastore_errors def get_entities(keys): rpc = datastore.GetRpcFromKwargs({}) keys, multiple = datastore.NormalizeAndTypeCheckKeys(keys) entities = None try: entities = datastore.Get(keys, rpc=rpc) except datastore_errors.EntityNotFoundError: assert not multiple return entities def put_entities(entities): rpc = datastore.GetRpcFromKwargs({}) keys = datastore.Put(entities, rpc=rpc) return keys

Deberías usar esto de la siguiente manera (estoy usando fetch para simplificar las cosas un poco sabio en código para este ejemplo)

x = Car.query(keys_only=True).fetch(100) results = get_entities([i.to_old_key() for i in x]) for i in results: i[''production_year''] = unicode(i[''production_year'']) put_entities(results)

Este es el código antiguo que tengo y datastore.NormalizeAndTypeCheckKeys toma la antigua clave de estilo db, no he visto para ver si hay una función equivalente para las claves de estilo ndb, pero esto funciona. (Acabo de probarlo ;-)

Este enfoque le permite migrar datos sin implementar ningún código nuevo.
Si tiene millones de entidades, entonces debe ver otros enfoques para el procesamiento, es decir, usar este código y usar mapreduce.

Supongamos que inicialmente creo un modelo ndb.y quería cambiar el tipo de propiedad ndb de un campo (por ejemplo, IntegerProperty a StringProperty), pero quería convertir los datos actuales almacenados en ese campo para no perder esos datos. Un método sería simplemente crear un nuevo nombre de campo y luego migrar los datos con un script, pero ¿hay otras maneras más convenientes de lograr esto?

Por ejemplo, supongamos que tengo el siguiente modelo:

class Car(ndb.Model): name = ndb.StringProperty() production_year = ndb.IntegerProperty()

Y almacené una instancia de la entidad:

c = new Car() c.name = "Porsche" c.production_year = 2013

Y quería cambiar production_year a un ndb.StringProperty () sin "perder" el valor que configuré (aún existiría, pero no sería recuperable). Si solo cambio production_year a una instancia de ndb.StringProperty (), el valor del campo no informa un valor que tenga sentido ya que el tipo no coincide.

Entonces si cambié el modelo a:

class Car(ndb.Model): name = ndb.StringProperty() production_year = ndb.StringProperty()

Intentar recuperar el campo con notación de puntos daría como resultado un valor de Ninguno. ¿Alguien se encuentra con esta situación y podría explicarme qué hizo para resolverla? Gracias.


Simplemente agregando a la respuesta de Tim, si desea cambiar su propiedad a Texto, puede:

from google.appengine.api import datastore_types (...) for i in results: i[''production_year''] = datastore_types.Text(i[''production_year''])