无法在google数据存储区中获取所有实体(使用PHP)

时间:2017-02-28 06:00:23

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

我是谷歌数据存储的新手,我无法获得所有实体。这是我的代码。

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"用来代替"返回"。这意味着返回的变量只是一个生成器对象。我没有使用生成器,所以我无法获取生成的数据。这就是我得到这个问题的原因。顺便说一句,我的所有代码都很好。 :)

感谢您的回复。

1 个答案:

答案 0 :(得分:0)

我不是PHP开发人员,但看起来您正在使用事务来加载实体的所有记录。这是不允许的,因为事务内的查询应该是祖先查询。我的猜测是你可能会得到一个异常/错误,表明它是相同的,但是被某个地方吞没了。如果您只需阅读实体,则不需要进行交易,只需使用数据存储即可。