yes, unfortunately the restrictions on projection queries are a bit of a pain: - each property queried must be indexed - i think that if any of the indexed properties is empty (as opposed to null) the row may not be returned (i have to recheck the docs on this) - can't use == and "project" the same field - can't use unindexable fields (text/blob)
given the GAE restrictions on projections....when you write an "invalid" projection query, what should web2py do? looks like in cases where GAE raises an error we just raise it back, in cases where GAE does not raise an error you get empty rows. i desire to update the web2py book with these notes once we have some testing, and i hopefully add 2 more GAE features this week..... On Tuesday, June 12, 2012 6:26:03 AM UTC-7, Anthony wrote: > > According to your model, valor is a text field, and projection queries do > not allow text fields either. > > Anthony > > On Tuesday, June 12, 2012 7:54:04 AM UTC-4, Alex Benfica wrote: >> >> Hi Anthony, >> >> You are rigth... but I left only the Field valor and still returns empty. >> :) >> >> That is the table... >> >> Field('nome', >> 'string', >> >> required = True, >> ), >> >> Field('valor', >> 'text', >> label="Valor: caso seja string ou numérico >> (opcional)", >> ), >> >> Field('valor_blob', >> 'blob',), >> >> Field('upl_valor', >> 'upload', >> uploadfield='valor_blob', >> label="Valor binario (opcional)", >> ), >> >> Field('descricao', >> 'text', >> ), >> >> >> >> >> >> >> On Monday, June 11, 2012 10:54:00 PM UTC-3, Anthony wrote: >>> >>> Is tabela.valor_blob a Blob field? The GAE documentation says >>> projections can only include indexed properties, so no Text or Blob >>> properties -- see >>> https://developers.google.com/appengine/docs/python/datastore/queries#Query_Projection. >>> >>> I would think that would result in an error, though. >>> >>> Anthony >>> >>> On Monday, June 11, 2012 9:35:28 PM UTC-4, Alex Benfica wrote: >>>> >>>> Hi Massimo and howesc! >>>> >>>> Testing again... I found a problem: >>>> >>>> Do not return errors ( but returns no rows... ). >>>> rows = self.db(self.tabela.nome == >>>> nome).select(self.tabela.valor, self.tabela.valor_blob) >>>> >>>> Returns the desired rows... >>>> rows = self.db(self.tabela.nome == nome).select() >>>> >>>> >>>> >>>> >>>> >>>> >>>> On Monday, June 11, 2012 10:10:18 PM UTC-3, Alex Benfica wrote: >>>>> >>>>> Hello people! >>>>> >>>>> First of all... thank you Massimo and howesc! >>>>> >>>>> About this question that I did and Massimo and howesc answerd on Stack >>>>> Overflow. >>>>> I tried to put some code there... but I could't... >>>>> >>>>> >>>>> http://stackoverflow.com/questions/10940995/does-google-app-engine-projection-queries-are-supported-by-web2py >>>>> >>>>> I did the web2py update to trunk and some parts of my code stopped >>>>> working. >>>>> Most of problems I got where like this below, that I still don't know >>>>> how to solve and keep it efficient, as I need to find the values by >>>>> "name", >>>>> not by id. >>>>> >>>>> I order to make it work, I just removed the fields I specified. >>>>> >>>>> Was this way (causing errors) >>>>> self.db(self.tabela.nome == nome).select(self.tabela.valor, >>>>> self.tabela.valor_blob, self.tabela.nome) >>>>> >>>>> I did that... now it selects all fields again... but works! >>>>> self.db(self.tabela.nome == nome).select() >>>>> >>>>> I'm problably missing something! How can I use projection queries with >>>>> web2py? The ID field that web2py creates are the same ID used by >>>>> datastore >>>>> on GAE? >>>>> I have a product that I need find by name... can I query it using >>>>> projection queries? Is that? >>>>> >>>>> >>>>> >>>>> >>>>> rows = self.db(self.tabela.nome == nome).select(self.tabela.valor, >>>>> self.tabela.valor_blob, self.tabela.nome) >>>>> File "D:\Dropbox\Devel\www\web2py\gluon\dal.py", line 8161, in select >>>>> return adapter.select(self.query,fields,attributes) >>>>> File "D:\Dropbox\Devel\www\web2py\gluon\dal.py", line 4149, in select >>>>> for t in fields] for item in items] >>>>> File "C:\Program Files >>>>> (x86)\Google\google_appengine\google\appengine\ext\db\__init__.py", line >>>>> 2313, in next >>>>> return self.__model_class.from_entity(self.__iterator.next()) >>>>> File "C:\Program Files >>>>> (x86)\Google\google_appengine\google\appengine\datastore\datastore_query.py", >>>>> >>>>> line 2809, in next >>>>> next_batch = self.__batcher.next() >>>>> File "C:\Program Files >>>>> (x86)\Google\google_appengine\google\appengine\datastore\datastore_query.py", >>>>> >>>>> line 2671, in next >>>>> return self.next_batch(self.AT_LEAST_ONE) >>>>> File "C:\Program Files >>>>> (x86)\Google\google_appengine\google\appengine\datastore\datastore_query.py", >>>>> >>>>> line 2708, in next_batch >>>>> batch = self.__next_batch.get_result() >>>>> File "C:\Program Files >>>>> (x86)\Google\google_appengine\google\appengine\api\apiproxy_stub_map.py", >>>>> line 604, in get_result >>>>> return self.__get_result_hook(self) >>>>> File "C:\Program Files >>>>> (x86)\Google\google_appengine\google\appengine\datastore\datastore_query.py", >>>>> >>>>> line 2450, in __query_result_hook >>>>> self._batch_shared.conn.check_rpc_success(rpc) >>>>> File "C:\Program Files >>>>> (x86)\Google\google_appengine\google\appengine\datastore\datastore_rpc.py", >>>>> >>>>> line 1214, in check_rpc_success >>>>> raise _ToDatastoreError(err) >>>>> BadRequestError: cannot use projection on a property with an equality >>>>> filter >>>>> >>>>