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
>>>>>>
>>>>>

Reply via email to