What do other people think? We can make the new behavior optional and only 
ckickin when both cache!=None and cacheable=True. 

Massimo




On Saturday, 8 September 2012 09:20:24 UTC-5, Anthony wrote:
>
> Does this break backward compatibility? If so, should we make caching the 
> full Rows object an option (maybe just via the new "cacheable" argument)?
>
> Anthony
>
> On Saturday, September 8, 2012 10:06:56 AM UTC-4, Massimo Di Pierro wrote:
>>
>> Short answer:
>>
>> if you cache the select, subqueries are missing. So you have to replace
>>
>>  email = row.emails.select().first()
>>
>> with
>>
>>  email = db(db.emails.studio==row.id).select().first()
>>
>>
>> This is probably the only change of behavior and it is due to the need of 
>> speedup. before cache was caching value but not the full object. We 
>> achieved a 100x speedup by caching the final rows object. The problem is 
>> that subselects, update_record and delete_record are methods of the rows 
>> and they are not serializable, therefore they are missing when the rows are 
>> cached.
>>
>> Massimo
>>
>>
>> On Saturday, 8 September 2012 08:34:46 UTC-5, Jose wrote:
>>>
>>> Hi all
>>>
>>> In Version 2.0.0 (2012-06-04 18:49:33) dev works well
>>>
>>> Model:
>>>
>>> tb_studio = db.define_table('studio',
>>>     Field('name', label=T('Name')),
>>>     #...
>>>     format='%(name)s',
>>>     migrate=MIGRATE
>>> )
>>>
>>> tb_emails = db.define_table('emails',
>>>     Field('studio', tb_studio, readable=False, writable=False, 
>>> default=1),
>>>     Field('email', label=T('Email')),
>>>     migrate=MIGRATE
>>> )
>>>
>>> Controller
>>>
>>> def bg_studio():
>>>     row = db(tb_studio.id==1).select(cache=(cache.ram, 60)).first()
>>>     email = row.emails.select().first()    
>>>
>>>     return dict(row=row, email=email)
>>>
>>>
>>> In Version 2.0.8 (2012-09-07 09:38:35) stable, error occurs:
>>>
>>> File "/usr/home/jose/web2py/applications/dm/controllers/default.py" 
>>> <http://127.0.0.1:8000/admin/default/edit/dm/controllers/default.py>, line 
>>> 45, in bg_studio
>>>     email = row.emails.select().first()
>>> AttributeError: 'Row' object has no attribute 'emails'
>>>
>>> Jose
>>>
>>

-- 



Reply via email to