无法将数据插入本地Google App Engine数据存储中。

7
我正在按照Google的移动购物助手示例中的步骤进行操作,该示例要求我根据this link导入数据。
我按照示例中的步骤进行了尝试(所有示例代码都是原始的,除了修复警告以使用最新的Gradle构建版本之外,我没有更改任何内容)
我相信我错过了一个在示例中未说明的重要步骤。有人能提供一些关于我做错哪些步骤的见解吗?
以下是我所做的步骤:
1. 启动本地googleAppEngine应用程序“backend” 2. 运行cmd "appcfg.py upload_data --config_file bulkloader.yaml --url=http://localhost:8080/remote_api --filename places.csv --kind=Place -e myEmailAddress@gmail.com"。 此命令应将2行插入数据存储区(places.csv包含两个条目) 3. 这给了我以下输出
10:07 AM Uploading data records.

[INFO    ] Logging to bulkloader-log-20151020.100728

[INFO    ] Throttling transfers:

[INFO    ] Bandwidth: 250000 bytes/second

[INFO    ] HTTP connections: 8/second

[INFO    ] Entities inserted/fetched/modified: 20/second

[INFO    ] Batch Size: 10

Error 302: --- begin server output ---

--- end server output ---
  1. 然后我转到 "http://localhost:8080/admin/buildsearchindex" 页面,显示 "MaintenanceTasks completed."

  2. 接下来我转到 "http://localhost:8080/_ah/admin",但是它显示:

Datastore 在 Empty 命名空间中没有实体。您需要在程序中添加数据,才能使用此工具查看和编辑数据。

enter image description here


你解决了吗?我也遇到了完全相同的问题。 - brandall
很遗憾,我没有这样做,而是跟随了http://rominirani.com/2014/01/10/google-cloud-endpoints-tutorial-part-1的例子。 - Angel Koh
1
谢谢您的回复。我会查看链接。真令人沮丧,我看不出我做错了什么.... :( - brandall
bulkloader 响应中的“Error 302”似乎表明插入失败了。也许查看服务器输出/ bulkoader 日志会给出发生了什么的线索? - Adam
@Adam,日志显示与上面相同(以“end server output”结尾)。我想我会为这个问题添加赏金,因为它太基础了,不能被无视! - brandall
你尝试过使用 --noauth_local_webserver 命令行参数吗? - Fábio Uechi
3个回答

13

我遇到了同样的问题,但不是在本地开发服务器上,而是在部署版本上。在几乎要疯掉的情况下,我找到了一个使用appcfg上传数据的解决方法。在我的情况下,我注意到当尝试以下操作时:

输入对我无效:

gcloud auth login
appcfg.py upload_data --config_file bulkloader.yaml --url=http://<yourproject>.appspot.com/remote_api --filename places.csv --kind=Place --email=<you@gmail.com>

错误输出:

11:10 AM Uploading data records.
[INFO    ] Logging to bulkloader-log-20160108.111007
[INFO    ] Throttling transfers:
[INFO    ] Bandwidth: 250000 bytes/second
[INFO    ] HTTP connections: 8/second
[INFO    ] Entities inserted/fetched/modified: 20/second
[INFO    ] Batch Size: 10
Error 302: --- begin server output ---

--- end server output ---

正如预期的那样,在第二个命令期间我没有被要求再次进行身份验证,但显然,appcfg仍无法对我的帐户进行身份验证。 我正在使用Win7,Python 2.7,其中包括appcfg.py和来自Google Cloud SDK的gcloud。

但是,在https://cloud.google.com/container-registry/docs/auth上显示,您可以使用gcloud命令打印出访问令牌,然后手动在您的appcfg命令中插入它,这对我起作用了。

适用于我的输入:

gcloud auth login
gcloud auth print-access-token

这会打印出访问令牌,您可以将其与appcfg一起使用。

appcfg.py upload_data --oauth2_access_token=<oauth2_access_token> --config_file bulkloader.yaml --url=http://<yourproject>.appspot.com/remote_api --filename places.csv --kind=Place --email=<you@gmail.com>

成功上传数据的输出:

10:42 AM Uploading data records.
[INFO    ] Logging to bulkloader-log-20160108.104246
[INFO    ] Throttling transfers:
[INFO    ] Bandwidth: 250000 bytes/second
[INFO    ] HTTP connections: 8/second
[INFO    ] Entities inserted/fetched/modified: 20/second
[INFO    ] Batch Size: 10
[INFO    ] Opening database: bulkloader-progress-20160108.104246.sql3
[INFO    ] Connecting to <yourproject>.appspot.com/remote_api
[INFO    ] Starting import; maximum 10 entities per post
.
[INFO    ] 3 entities total, 0 previously transferred
[INFO    ] 3 entities (4099 bytes) transferred in 1.7 seconds
[INFO    ] All entities successfully transferred

我希望这能帮助任何试图解决此问题的人。对我来说,不清楚此问题的源头在哪里,但这是对我有效的一种解决方法。

顺便提一下,我在Mac上也遇到了同样的问题。


谢谢,这对我有用!此外,您可以像这样简化命令以避免复制和粘贴:--oauth2_access_token=\gcloud auth print-access-token`` - Ben Baron

4

以下是我通过测试发现的内容。最初我经历了相同的步骤并收到了相同的错误,但值得注意的是输出中的条目INFO client.py:669 access_token is expired

MobileAssistant-Data> appcfg.py upload_data --config_file bulkloader.yaml --url=http://localhost:8080/remote_api --filename places.csv --kind=Place -e myEmailAddress@gmail.com
05:12 PM Uploading data records.
[INFO    ] Logging to bulkloader-log-20151112.171238
[INFO    ] Throttling transfers:
[INFO    ] Bandwidth: 250000 bytes/second
[INFO    ] HTTP connections: 8/second
[INFO    ] Entities inserted/fetched/modified: 20/second
[INFO    ] Batch Size: 10
2015-11-12 17:12:38,466 INFO client.py:669 access_token is expired. Now: 2015-11-12 22:12:38.466000, token_expiry: 2015-11-06 01:33:21
Error 302: --- begin server output ---

这看起来有点像我在开发服务器的远程API处理程序中看到的一个问题,该问题在ClientLogin被弃用之后浮出水面(但在Python SDK中)。只是为了测试,我编辑了build.gradle以使用最新的SDK版本(从1.9.18升级到1.9.28),然后再次运行它:

MobileAssistant-Data> appcfg.py upload_data --config_file bulkloader.yaml --url=http://localhost:8080/remote_api --filename places.csv --kind=Place -e myEmailAddress@gmail.com
05:16 PM Uploading data records.
[INFO    ] Logging to bulkloader-log-20151112.171615
[INFO    ] Throttling transfers:
[INFO    ] Bandwidth: 250000 bytes/second
[INFO    ] HTTP connections: 8/second
[INFO    ] Entities inserted/fetched/modified: 20/second
[INFO    ] Batch Size: 10
2015-11-12 17:16:15,177 INFO client.py:669 access_token is expired. Now: 2015-11-12 22:16:15.177000, token_expiry: 2015-11-06 01:33:21
2015-11-12 17:16:15,565 INFO client.py:669 access_token is expired. Now: 2015-11-12 22:16:15.565000, token_expiry: 2015-11-06 01:33:21
2015-11-12 17:16:15,573 INFO client.py:571 Refreshing due to a 401 (attempt 1/2)
2015-11-12 17:16:15,575 INFO client.py:797 Refreshing access_token
2015-11-12 17:16:16,039 INFO client.py:571 Refreshing due to a 401 (attempt 2/2)
2015-11-12 17:16:16,040 INFO client.py:797 Refreshing access_token
... (ad infinitum)

这个输出现在与Python远程API问题完全相同。因此,似乎Java远程API存在相同的问题(身份验证检查未正确更新以使用新的身份验证方案)。
在Python中的解决方法是手动编辑SDK源代码并取消身份验证检查。我怀疑Java SDK需要类似的黑客攻击。不过,这并不像SDK那样直接,因为SDK需要从源代码重新构建。
如果我发现任何其他信息,我将用我的发现更新这个答案。请注意,这应该与部署的应用程序完美地工作,只有开发服务器受到影响。
更新:
罪魁祸首是com/google/apphosting/utils/remoteapi/RemoteApiServlet.java中的管理员检查,与上述Python SDK中的相同问题。不幸的是,你不能轻松地从源代码重新构建SDK,因为build.xml中的构建目标仅包括“jsr107cache”,其余的构建都是从预生成的二进制文件完成的。看起来我们将不得不等待直到这在未来的版本中得到修复,但现在我将更新公共错误。

目前,我建议您坚持使用文档,并仅使用部署的应用程序版本进行remote_api上传。


2
感谢你的努力,Adam。我已经复制了你的答案,并在错误跟踪器上找到了它 - https://code.google.com/p/googleappengine/issues/detail?id=12445 希望他们能尽快发布修复程序。 - brandall

-1
更好地使用Google开发者控制台中的新UI。网址:https://console.developers.google.com/project/<YOUR_PROJECT_ID>/datastore 您可以查看此页面的查询或索引子部分以获取您的类型[也可以使用GQL]和索引。

enter image description here

注意:我还注意到,除非在查询部分中添加一些数据,否则某种特定类型不会出现[GQL也会返回空数据]。但是我在索引部分看到了那个特定的类型。


本地主机有获取新用户界面的链接吗? - Angel Koh
1
我不确定它在本地主机上的行为如何。 - Aniket Thakur
2
新的用户界面仅适用于已部署的应用程序。对于开发服务器,只有一个基本的用户界面,这是Angel已经在使用的。 - Adam
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - johnvdenley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接