descargar datos crear comandos google-app-engine

google-app-engine - descargar - crear base de datos sqlite comandos



Cómo descomprimir la base de datos sqlite3 escrita por el descargador masivo de Google AppEngine (2)

Necesito descargar todas las instancias de entidad bastante grande (multi-GB) en el almacén de datos de mi aplicación. Tengo suficiente espacio en disco para almacenar los datos de la entidad, pero no lo suficiente para almacenar tanto los datos originales que recupera el descargador masivo como una base de datos SQLite y la versión procesada de los datos que el programa de descarga escribe después de aplicar las transformaciones especificadas en mi bulkloader.yaml archivo. Dado esto, estoy bastante seguro de que la operación de descarga masiva recuperaría correctamente la base de datos SQLite, y luego fallaría al intentar aplicar las transformaciones.

Esto podría estar bien, ya que hay otro sistema disponible al que podría mover la base de datos SQLite y dónde podría descomprimirlo. (El otro sistema que tengo disponible tiene Python instalado pero no una versión que admita las herramientas de AppEngine, y no tengo permiso para actualizar Python en esa máquina, así que no puedo hacer la descarga masiva directamente allí). Pude recuperar los datos que necesito si pudiera escribir algún código Python para cargar la base de datos SQLite y leer su tabla de resultados, pero no puedo entender qué hacer con los datos SQLite - cuando uso el módulo SQLite para conectarme a la base de datos y descomprimir filas de la tabla, parecen contener metadatos además de los datos que me interesan (los datos que mi aplicación App Engine en realidad colocó en el almacén de datos).

Sé que el proceso de descarga masiva appcfg.py puede leer esta información, ya que puede transformar los datos de la forma que especifico en bulkloader.yaml, pero no he localizado el código del kit de herramientas de AppEngine que realiza este desempaquetado. Cualquier ayuda o consejos serían apreciados.


Aquí está el código que funcionó para mí:

import sqlite3; from google.appengine.datastore import entity_pb from google.appengine.api import datastore conn = sqlite3.connect(''UserRecord.db'', isolation_level=None) cursor = conn.cursor() cursor.execute(''select id, value from result order by sort_key, id'') for unused_entity_id, entity in cursor: entity_proto = entity_pb.EntityProto(contents=entity) print datastore.Entity._FromPb(entity_proto)


Las entidades se almacenan en la base de datos SQLite descargada como Buffers de Protocolo codificados (lo mismo que se almacenan en el entorno de producción, y en cualquier otro lugar; una entidad es , en resumen, un PB codificado). Puede leerlos usted mismo usando el código SDK para decodificar entidades ( db.proto_to_entity() etc), pero será todo un trabajo db.proto_to_entity() todo.

El código relevante es la clase ResultDatabase en bulkloader.py , que probablemente pueda volver a utilizar, junto con otras partes del cargador masivo, para facilitar su trabajo.