【问题标题】:Cannot get all entities under a kind in google datastore (using PHP)无法在谷歌数据存储中获取所有实体(使用 PHP)
【发布时间】:2017-02-28 06:00:23
【问题描述】:

我是 google 数据存储区的新手,我无法将所有实体都放在一个种类下。这是我的代码。

use Google\Cloud\Datastore\DatastoreClient;
use Google\Cloud\Datastore\Query\Query;

function get_datastore_client(){

    # Your Google Cloud Platform project ID
    $projectId = 'my-project-id';

    # Instantiates a client
    $datastore = new DatastoreClient([
            'projectId' => $projectId
    ]);

    return $datastore;

}

function get_athlete_list(DatastoreClient $datastore){

    $transaction = $datastore->transaction();

    $query = $datastore->query()
        ->kind('Athlete')
        ->order('country');

    $result = $transaction->runQuery($query);

    $transaction->commit();

    return $result;

}

$datastore = get_datastore_client();
$all_athletes = get_athlete_list($datastore);

当我运行它时,我得到了空结果。请帮我找出问题所在。

更新:

我尝试过使用数据存储而不是事务,但它也不起作用。没有事务的函数如下。

function get_athlete_list(DatastoreClient $datastore){

    $query = $datastore->query()
            ->kind('Athlete')
            ->order('country');

    $result = $datastore->runQuery($query);

    return $result;

}

奇怪的是我可以通过它的 ID 得到一个实体,函数如下。我就是无法获取所有实体。

(This function works.)

function lookup_athlete(DatastoreClient $datastore, $athlete_id){

    $transaction = $datastore->transaction();

    $kind = 'Athlete';

    $athleteKey = $datastore->key($kind, $athlete_id);

    $athlete = $transaction->lookup($athleteKey);
    if(empty($athlete)){
        $transaction->rollback();
    }

    return $athlete;
}

所以我认为这可能是一个设置问题,但我无法找到。根据本文档Accessing the Cloud Datastore API from a Compute Engine instance,我在计算引擎实例中运行了它,并且我有一个 APP 引擎实例正在运行。

更新解决方案:

经过数小时的研究,我发现在数据存储库中,使用“yield”而不是“return”。这意味着返回的变量只是一个生成器对象。而且我没有使用生成器,所以无法获取生成的数据。这就是我遇到问题的原因。顺便说一句,我所有的代码都很好。 :)

感谢大家的回复。

【问题讨论】:

  • 您是否尝试在没有 order 子句的情况下运行查询?
  • 嗨迈克尔,我试过了,但还是不行。

标签: php google-app-engine error-handling google-cloud-datastore


【解决方案1】:

我不是 PHP 开发人员,但看起来您正在使用事务从实体加载所有记录。这是不允许的,因为事务中的查询应该是祖先查询。我的猜测是,您可能会收到一个异常/错误,指示相同,但​​正在某个地方被吞没。如果您只需要读取实体,则不需要事务,只需使用数据存储即可。

【讨论】:

  • 谢谢,但数据存储也对我不起作用。我使用事务是因为我可以使用它来获取单个实体。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-01
  • 2017-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
相关资源
最近更新 更多