1. that is how GAE queries works.  it's GAE's fault, not web2py's. 
2. correct.  Rows objects are not pickelable.  as_list() or as_dict() are 
your friend.  this is not just for GAE but all environments i believe.

On Friday, March 16, 2012 10:03:36 AM UTC-7, Sushant Taneja wrote:
>
> Hi,
>
> I am stuck here, I tried the mentioned code, there are 2 problems I am 
> facing:
>
> 1. All the table columns are extracted rather than only the two columns in 
> the select()
> 2. I get pickling error when I try to add the Rows object to memcache
>
> *PicklingError: Can't pickle <type 'function'>: attribute lookup 
> __builtin__.function failed*
>
> but once I use the as_list() function it works fine.
>
> Any thoughts ?
>
> On Friday, March 16, 2012 1:07:58 PM UTC+5:30, Sushant Taneja wrote:
>>
>> Thanks ! 
>>
>> On Friday, March 16, 2012 2:04:42 AM UTC+5:30, Jonathan Lundell wrote:
>>>
>>> On Mar 15, 2012, at 1:15 PM, Sushant Taneja wrote:
>>> > I have a tags table which will be available to all logged in users. 
>>> The table has the following structure:
>>> > 
>>> > db.define_table('META_TAG',
>>> >     Field('tag','string',notnull=True),
>>> >     Field('root_tag','string',notnull=True),
>>> >     Field('active_ind','string',length=1,default='Y')
>>> > )
>>> > 
>>> > This table will be rarely (once a month) updated via an administrative 
>>> interface.
>>> > I read various web2py based examples and gae examples on using 
>>> memcache. Each followed a different approach.
>>> > As per my understanding from appengine documentation, I have written 
>>> the following helper function in a controller to use memcache:
>>> > 
>>> > from google.appengine.api import memcache
>>> > 
>>> > def get_tags():
>>> >     """This function returns cached value for META_TAG table"""
>>> >     tags = memcache.get("tags")
>>> >     if not words:
>>> >         words = 
>>> db(db.META_TAG.active_ind=='Y').select(db.META_TAG.tag,db.META_TAG.root_tag)
>>> >         memcache.add("tags",tags)
>>> >         return tags
>>> >     else:
>>> >         return tags
>>> > 
>>> > Will the above code ensure that the correct data is always available 
>>> in the memcache ?
>>>
>>> You seem to be mixing the names 'words' and 'tags'.
>>>
>>> As a matter of style, I'd move the return outside the if/else.
>>>
>>> Don't forget to set the cache when you update the tags.
>>>
>>> It's best to test for 'is None', in case your cached object can 
>>> legitimately evaluate to False (an empty list or string, for example). So 
>>> more like:
>>>
>>> from google.appengine.api import memcache
>>>
>>> def get_tags():
>>>     """This function returns cached value for META_TAG table"""
>>>     tags = memcache.get("tags")
>>>     if tags is None:
>>>         tags = 
>>> db(db.META_TAG.active_ind=='Y').select(db.META_TAG.tag,db.META_TAG.root_tag)
>>>         memcache.add("tags",tags)
>>>     return tags
>>>
>>>

Reply via email to