2012-07-15 37 views
1

我已经使用AppEngine的appcfg.py将我的整个数据库转储了。结果是一个带有'result'表的SQLITE3数据库。该表包含三个字段,一个键,一个数据和一个索引字段。数据字段包含实体数据和字段,但它们都以协议缓冲区格式编码。我想提取这个原始协议缓冲区格式到一个数组或什么是很容易解析(最好在PHP中)。如何解码原始协议缓冲区从AppEngine导出的数据?

我在Python中拥有原始的实体模型结构。我已经检查了几个Protocol Buffers库,但是到目前为止还没有找到一种方法来提取RAW Protocol Buffer数据。

有什么简单的方法来做到这一点在PHP中?我不想生成和编码协议缓冲区;我想用最简单/最简单的方法解码原始协议缓冲区数据。

+1

你有没有考虑过使用bulkloader https://developers.google.com/appengine/docs/python/tools/uploadingdata#Configuring_the_Bulk_Loader并以csv或xml格式下载数据。它可能会为你节省很多时间。 – 2012-07-16 00:07:15

+0

谢谢蒂姆 - 是的,我考虑过了(还在考虑)。不幸的是,我已经将所有数据从AppEngine中导出了,并且由于数据量极大,因此花了几天的时间。如果有机会原始解码我的本地转储将是非常棒的。否则,我可能不得不使用模型转换重新导出或创建一个应用程序并运行它将以适当的格式导出。感谢您的提示,如果我无法在本地解码,我可能必须这样做。 – 2012-07-16 00:19:28

+1

它可能值得深入探讨upload_data过程的内容,它从sqlite3结果数据库中读取blob,并查看是否有任何使用。 – 2012-07-16 01:01:24

回答

3

编码后的协议缓冲区是Entity协议缓冲区的一个实例,可在Python SDK中找到google.appengine.ext.datastore.entity_pb。毫无疑问,PHP协议缓冲区库,但您首先需要找到实体协议缓冲区定义的副本,并使用该库为它构建一个阅读器。在Python SDK中使用现有的支持可能会更简单,并且编写一个简单的Python脚本来从协议缓冲区中提取相关字段并以可轻松加载到PHP中的格式输出它们。

一些Python API中解码协议缓冲区,你这样做:

entity = entity_pb.EntityProto(contents=data) 
+0

我仔细检查了所有可用的选项和所有可用的PHP库之后,发现您的解决方案是从编码的PB格式中提取数据最简单的方法。但是,正如Tim在上面评论的那样,最好的解决方案可能是使用批量下传器,因此完全可以避免提取。谢谢您的回答。 – 2012-07-16 04:23:46