连接到 Google App Engine 数据存储

Posted

技术标签:

【中文标题】连接到 Google App Engine 数据存储【英文标题】:Connect to Google App Engine Datastore 【发布时间】:2016-07-22 09:41:59 【问题描述】:

我正在尝试从我的本地计算机用 Java 连接到 Google App Engine 的数据存储区。我不会将服务与 GAE 上的应用程序一起使用,它将在 AWS 上。

我尝试了什么

我尝试使用 DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();,但我认为它适用于应用程序托管在 GAE 上的情况。

现在,我使用系统变量 GOOGLE_APPLICATION_CREDENTIALS 获取的 json 凭据文件启动并运行 Google Storage。连接工作正常,所以我的猜测是我可能需要做一些类似于 Storage 的事情。 我为存储做了这样的事情:

HttpTransport transport = GoogleNetHttpTransport.newTrustedTransport();
        JsonFactory jsonFactory = new JacksonFactory();
        GoogleCredential credential = GoogleCredential.getApplicationDefault(transport, jsonFactory);

        if (credential.createScopedRequired()) 
            Collection<String> bigqueryScopes = StorageScopes.all();
            credential = credential.createScoped(bigqueryScopes);
        

        Storage client = new Storage.Builder(transport, jsonFactory, credential)
                .setApplicationName("APPLICATION_NAME")
                .build();

问题

所以我的问题是:如何从 Google App Engine 外部连接到 Google App Engine Datastore?

感谢您的帮助!

【问题讨论】:

【参考方案1】:

我建议您转到gcloud-java client library。它建立在您当前使用的代码之上,可以更轻松地使用数据存储和存储,尽管文档几乎不存在(截至 2016 年 4 月)。

这是您使用此库连接到数据存储区的方式:

AuthCredentials credentials = AuthCredentials.createFor(account, key);
DatastoreOptions options = DatastoreOptions.builder()
        .authCredentials(credentials)
        .projectId(projectId)
        .namespace(NAMESPACE)
        .build();
Datastore datastore = options.service();

Storage 也一样,但带有 StorageOptions。

提示:在 GitHub 中打开 gcloud-java 项目 - 链接在我之前引用的页面上。有一个文件夹包含如何使用 Datastore 和 Storage 的示例。

【讨论】:

非常感谢您的快速回答!该项目设法“工作”,但现在我收到一个不同的错误,告诉我没有为我的项目启用 api: 项目 PROJECT_NAME 没有启用 Cloud Datastore API 奇怪的是我在 api 中启用了它控制台:link 你知道我是否需要做其他事情吗?谢谢! dev 上的另一个选项是使用GOOGLE_APPLICATION_CREDENTIALS 环境变量指向从云控制台中的凭据选项卡生成的服务帐户json,例如export GOOGLE_APPLICATION_CREDENTIALS=/path/to/key.json 成功了!!非常感谢您的帮助,我有 API beta2 而不是 beta3。激活 beta3 效果很好。【参考方案2】:

在 Andrei Volgin 的出色帮助下,我设法从 Google App Engine 之外的应用程序连接到 Datastore。以下是我在 2016 年 4 月所做的:

启用数据存储 API v1beta3。对我来说,App Engine 中的默认设置是 v1beta2。 https://console.cloud.google.com/apis/api/datastore.googleapis.com/overview?project=PROJECT_NAME 获取已激活 Datastore 的服务的凭据文件。 您可以使用GOOGLE_APPLICATION_CREDENTIALS=/path/to/credentials.json 在系统变量中设置凭据文件

我写了这段代码作为测试并且连接正常

DatastoreOptions options = DatastoreOptions.builder()
        .projectId("PROJECT_NAME")
        .authCredentials(AuthCredentials.createForJson(
                new FileInputStream("/PATH/TO/CREDENTIALS.json"))).build();
Datastore datastore = options.service();
Query<Entity> query =
        Query.gqlQueryBuilder(Query.ResultType.ENTITY, "SELECT * FROM user").build();
QueryResults<Entity> results = datastore.run(query);
while (results.hasNext()) 
    Entity result = results.next();
    System.out.println(result.getString("id"));

【讨论】:

以上是关于连接到 Google App Engine 数据存储的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 应用在部署到 Google App Engine 时无法连接到 Google Cloud SQL (PostgreSQL)

Google App Engine Golang 连接到 Cloud SQL Postgres unix dial no such file or directory

如何将从谷歌域购买的网络域名连接到在谷歌 App Engine 上开发的网站?

无法从在具有自定义运行时的 Docker 中运行 .NET Core 应用程序的 App Engine 连接到 Google Cloud SQL 中的 postgres

利用 Firebase 和 Google App Engine 将后台逻辑添加到实时数据

App Engine Java Servlet 未连接到 Cloud SQL