def run_query(self, project, query_pb, namespace=None, eventual=False, transaction_id=None): """Run a query on the Cloud Datastore. Maps the ``DatastoreService.RunQuery`` protobuf RPC. Given a Query protobuf, sends a ``runQuery`` request to the Cloud Datastore API and returns a list of entity protobufs matching the query. You typically wouldn't use this method directly, in favor of the :meth:`gcloud.datastore.query.Query.fetch` method. Under the hood, the :class:`gcloud.datastore.query.Query` class uses this method to fetch data. :type project: string :param project: The project over which to run the query. :type query_pb: :class:`gcloud.datastore._generated.query_pb2.Query` :param query_pb: The Protobuf representing the query to run. :type namespace: string :param namespace: The namespace over which to run the query. :type eventual: bool :param eventual: If False (the default), request ``STRONG`` read consistency. If True, request ``EVENTUAL`` read consistency. :type transaction_id: string :param transaction_id: If passed, make the request in the scope of the given transaction. Incompatible with ``eventual==True``. :rtype: tuple :returns: Four-tuple containing the entities returned, the end cursor of the query, a ``more_results`` enum and a count of the number of skipped results. """ request = _datastore_pb2.RunQueryRequest() _set_read_options(request, eventual, transaction_id) if namespace: request.partition_id.namespace_id = namespace request.query.CopyFrom(query_pb) response = self._datastore_api.run_query(project, request) return ( [e.entity for e in response.batch.entity_results], response.batch.end_cursor, # Assume response always has cursor. response.batch.more_results, response.batch.skipped_results, )
def run_query(self, project, query_pb, namespace=None, eventual=False, transaction_id=None): """Run a query on the Cloud Datastore. Maps the ``DatastoreService.RunQuery`` protobuf RPC. Given a Query protobuf, sends a ``runQuery`` request to the Cloud Datastore API and returns a list of entity protobufs matching the query. You typically wouldn't use this method directly, in favor of the :meth:`gcloud.datastore.query.Query.fetch` method. Under the hood, the :class:`gcloud.datastore.query.Query` class uses this method to fetch data: >>> from gcloud import datastore >>> client = datastore.Client() >>> query = client.query(kind='MyKind') >>> query.add_filter('property', '=', 'val') Using the query iterator's :meth:`next_page() <.datastore.query.Iterator.next_page>` method: >>> query_iter = query.fetch() >>> entities, more_results, cursor = query_iter.next_page() >>> entities [<list of Entity unmarshalled from protobuf>] >>> more_results <boolean of more results> >>> cursor <string containing cursor where fetch stopped> Under the hood this is doing: >>> connection.run_query('project', query.to_protobuf()) [<list of Entity Protobufs>], cursor, more_results, skipped_results :type project: string :param project: The project over which to run the query. :type query_pb: :class:`gcloud.datastore._generated.query_pb2.Query` :param query_pb: The Protobuf representing the query to run. :type namespace: string :param namespace: The namespace over which to run the query. :type eventual: bool :param eventual: If False (the default), request ``STRONG`` read consistency. If True, request ``EVENTUAL`` read consistency. :type transaction_id: string :param transaction_id: If passed, make the request in the scope of the given transaction. Incompatible with ``eventual==True``. """ request = _datastore_pb2.RunQueryRequest() _set_read_options(request, eventual, transaction_id) if namespace: request.partition_id.namespace_id = namespace request.query.CopyFrom(query_pb) response = self._rpc(project, 'runQuery', request, _datastore_pb2.RunQueryResponse) return ( [e.entity for e in response.batch.entity_results], response.batch.end_cursor, # Assume response always has cursor. response.batch.more_results, response.batch.skipped_results, )