def get_entities(self, keys): # This import is here to avoid circular references. from gcloud.datastore.entity import Entity entity_pbs = self.connection().lookup(dataset_id=self.id(), key_pbs=[k.to_protobuf() for k in keys]) entities = [] for entity_pb in entity_pbs: entities.append(Entity.from_protobuf(entity_pb, dataset=self)) return entities
def fetch(self, limit=None): """Executes the Query and returns all matching entities. This makes an API call to the Cloud Datastore, sends the Query as a protobuf, parses the responses to Entity protobufs, and then converts them to :class:`gcloud.datastore.entity.Entity` objects. For example:: >>> from gcloud import datastore >>> dataset = datastore.get_dataset('dataset-id', email, key_path) >>> query = dataset.query('Person').filter('name =', 'Sally') >>> query.fetch() [<Entity object>, <Entity object>, ...] >>> query.fetch(1) [<Entity object>] >>> query.limit() None :type limit: integer :param limit: An optional limit to apply temporarily to this query. That is, the Query itself won't be altered, but the limit will be applied to the query before it is executed. :rtype: list of :class:`gcloud.datastore.entity.Entity`'s :returns: The list of entities matching this query's criteria. """ clone = self if limit: clone = self.limit(limit) (entity_pbs, end_cursor, more_results, skipped_results) = self.dataset().connection().run_query( query_pb=clone.to_protobuf(), dataset_id=self.dataset().id()) self._cursor = end_cursor return [Entity.from_protobuf(entity, dataset=self.dataset()) for entity in entity_pbs]
def _get_value_from_protobuf(pb): """Given a protobuf for a Property, get the correct value. The Cloud Datastore Protobuf API returns a Property Protobuf which has one value set and the rest blank. This function retrieves the the one value provided. Some work is done to coerce the return value into a more useful type (particularly in the case of a timestamp value, or a key value). :type pb: :class:`gcloud.datastore.datastore_v1_pb2.Property` :param pb: The Property Protobuf. :returns: The value provided by the Protobuf. """ if pb.value.HasField('timestamp_microseconds_value'): microseconds = pb.value.timestamp_microseconds_value naive = (datetime.utcfromtimestamp(0) + timedelta(microseconds=microseconds)) return naive.replace(tzinfo=pytz.utc) elif pb.value.HasField('key_value'): return Key.from_protobuf(pb.value.key_value) elif pb.value.HasField('boolean_value'): return pb.value.boolean_value elif pb.value.HasField('double_value'): return pb.value.double_value elif pb.value.HasField('integer_value'): return pb.value.integer_value elif pb.value.HasField('string_value'): return pb.value.string_value elif pb.value.HasField('entity_value'): return Entity.from_protobuf(pb.value.entity_value) else: return None
def fetch(self, limit=None): """Executes the Query and returns all matching entities. This makes an API call to the Cloud Datastore, sends the Query as a protobuf, parses the responses to Entity protobufs, and then converts them to :class:`gcloud.datastore.entity.Entity` objects. For example:: >>> from gcloud import datastore >>> dataset = datastore.get_dataset('dataset-id', email, key_path) >>> query = dataset.query('Person').filter('name =', 'Sally') >>> query.fetch() [<Entity object>, <Entity object>, ...] >>> query.fetch(1) [<Entity object>] >>> query.limit() None :type limit: integer :param limit: An optional limit to apply temporarily to this query. That is, the Query itself won't be altered, but the limit will be applied to the query before it is executed. :rtype: list of :class:`gcloud.datastore.entity.Entity`'s :returns: The list of entities matching this query's criteria. """ clone = self if limit: clone = self.limit(limit) entity_pbs = self.dataset().connection().run_query( query_pb=clone.to_protobuf(), dataset_id=self.dataset().id()) return [ Entity.from_protobuf(entity, dataset=self.dataset()) for entity in entity_pbs ]