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