使用bulkloader从Google App Engine下载数据时出错

3 投票
1 回答
567 浏览
提问于 2025-04-16 13:27

我正在尝试使用以下命令从数据存储中下载一些数据:

appcfg.py download_data --config_file=bulkloader.yaml --application=myappname 
                        --kind=mykindname --filename=myappname_mykindname.csv
                        --url=http://myappname.appspot.com/_ah/remote_api 

在这个特定的种类/表中,当数据量不多的时候,我可以一次性下载所有数据——偶尔会遇到以下错误:

.................................[ERROR   ] [Thread-11]
ExportProgressThread:
Traceback (most recent call last):
  File "C:\Program Files\Google\google_appengine\google\appengine\tools
\bulkload
er.py", line 1448, in run
    self.PerformWork()
  File "C:\Program Files\Google\google_appengine\google\appengine\tools
\bulkload
er.py", line 2216, in PerformWork
    item.key_end)
  File "C:\Program Files\Google\google_appengine\google\appengine\tools
\bulkload
er.py", line 2011, in StoreKeys
    (STATE_READ, unicode(kind), unicode(key_start), unicode(key_end)))
OperationalError: unable to open database file

这是我在服务器日志中看到的内容:

Traceback (most recent call last):
  File "/base/python_runtime/python_lib/versions/1/google/appengine/
ext/remote_api/handler.py", line 277, in post
    response_data = self.ExecuteRequest(request)
  File "/base/python_runtime/python_lib/versions/1/google/appengine/
ext/remote_api/handler.py", line 308, in ExecuteRequest
    response_data)
  File "/base/python_runtime/python_lib/versions/1/google/appengine/
api/apiproxy_stub_map.py", line 86, in MakeSyncCall
    return stubmap.MakeSyncCall(service, call, request, response)
  File "/base/python_runtime/python_lib/versions/1/google/appengine/
api/apiproxy_stub_map.py", line 286, in MakeSyncCall
    rpc.CheckSuccess()
  File "/base/python_runtime/python_lib/versions/1/google/appengine/
api/apiproxy_rpc.py", line 126, in CheckSuccess
    raise self.exception
ApplicationError: ApplicationError: 4 no matching index found. 

当出现这个错误时,我只需重新运行下载,通常就能顺利完成。

最近,我注意到随着我的种类数据量的增加,下载工具失败的次数也越来越多。例如,对于一个大约有3500个实体的种类,我需要运行这个命令5次——只有最后一次成功。有没有办法解决这个错误?之前我唯一担心的是因为偶尔的失败,无法在脚本中自动下载,现在我更害怕根本无法获取我的数据。

这个问题之前在这里讨论过,但那篇帖子比较旧,我不太确定建议的标志是干什么的——所以我再次发帖询问类似的问题。


一些额外的细节。正如这里提到的,我尝试了继续中断下载的建议(在从App Engine下载数据这一节中)。当我在中断后恢复下载时,没有出现错误,但下载的行数少于数据存储管理员显示的实体数量。这是我收到的消息:

[INFO    ] Have 3220 entities, 3220 previously transferred
[INFO    ] 3220 entities (1003 bytes) transferred in 2.9 seconds

数据存储管理员告诉我这个特定的种类大约有4300个实体。为什么剩下的实体没有被下载呢?

谢谢!

1 个回答

0

我想根据看到的第一个错误信息中的“unicode”这个词,做个完全不专业的猜测。我之前遇到过一个问题,跟用户在网上输入的数据有关。有个用户输入了一些unicode字符,结果导致很多东西都出问题了——可能是我自己的错,因为我实现了一些看起来很漂亮的repr函数和其他一些功能。如果可以的话,试着在你正在运行的应用程序的控制台里快速查看一下你的数据,可能的话(如果只有4000条记录),尝试把所有数据转换成ascii字符串,看看有没有不符合的。

之后,我开始对用户输入的数据进行“清理”(抱歉,我的“公开昵称”字段只接受ascii字符!)

撰写回答