It is a requirement that if a list of fields is specific in the select(*fields) a superset of those fields be returned. Not a subset and not an error. This is because of backward compatibility. We need to detect problems with *fields and find a workaround.
On Tuesday, 12 June 2012 10:37:26 UTC-5, howesc wrote: > > 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 >>>>>> >>>>>