我需要在我的应用数据存储区中下载相当大(多GB)实体的所有实例。我有足够的磁盘空间来存储实体的数据,但不足以存储批量下载程序检索的原始数据作为SQLite数据库和下载程序在应用后写入的数据的处理版本我的bulkloader.yaml文件中指定的转换。鉴于此,我非常确定批量下载操作会成功检索SQLite数据库,然后在尝试应用转换时失败。
这可能没问题,因为我可以 移动SQLite数据库的另一个系统可以解压缩它。 (我可用的另一个系统安装了Python,但没有支持AppEngine工具的版本 - 我没有权限在该机器上升级Python - 所以我不能直接在那里进行批量下载。)我可以检索我需要的数据如果我可以编写一些Python代码来加载SQLite数据库并读取其结果表,但我无法弄清楚SQLite数据的用途 - 当我使用SQLite模块时连接到数据库并解压缩表的行,除了我感兴趣的数据(我的AppEngine应用程序实际放置在数据存储区中的数据)之外,它们似乎还包含元数据。
我知道appcfg.py批量下载过程可以读取这些数据,因为它可以按照我在bulkloader.yaml中指定的方式转换数据,但是我没有找到执行此解包的AppEngine工具包代码。任何帮助或指示将不胜感激。
答案 0 :(得分:4)
实体作为编码的协议缓冲区存储在下载的SQLite数据库中(与它们存储在生产环境中相同,并且在其他任何地方 - 实体 编码的PB,简而言之)。您可以使用SDK代码解码实体(db.proto_to_entity()
等)来自己阅读它们,但设置一切都会有点工作。
相关代码是ResultDatabase class in bulkloader.py - 您可以重复使用,以及批量加载程序的其他部分,以使您的工作更轻松。
答案 1 :(得分:2)
这里有适合我的代码:
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)