I do not fully understand this. It mush have something to do with the 
scoping of variables in python.

Can you try replace

db.reviews.pos = Field.Lazy(lambda row: db((db.reviews_like.review_id == 
row.reviews.id) & (db.reviews_like.helpful == True)).count() )
db.reviews.neg = Field.Lazy(lambda row: db((db.reviews_like.review_id == 
row.reviews.id) & (db.reviews_like.helpful == False)).count() )

with

db.reviews.pos = Field.Lazy(lambda row,db=db: db((db.reviews_like.review_id 
== row.reviews.id) & (db.reviews_like.helpful == True)).count() )
db.reviews.neg = Field.Lazy(lambda row,db=db: db((db.reviews_like.review_id 
== row.reviews.id) & (db.reviews_like.helpful == False)).count() )

or with

def lazy1(row,db=db): return db((db.reviews_like.review_id == row.reviews.id) 
& (db.reviews_like.helpful == True)).count()
def lazy2(row,db=db): return db((db.reviews_like.review_id == row.reviews.id) 
& (db.reviews_like.helpful == False)).count()
db.reviews.pos = Field.Lazy(lazy1)
db.reviews.neg = Field.Lazy(lazy2)

On Saturday, 1 September 2012 05:50:35 UTC-5, João Saraiva wrote:
>
> Hello,
>
> Could it be something related to Dropbox's sync mechanism? Have you tried 
> running your app in another folder outside of Dropbox's reach? Would 
> probably explain why your example works fine on other user's machines.
>
> Best regards,
> JS
>
>
> On Saturday, September 1, 2012 6:34:39 AM UTC+1, Paolo wrote:
>>
>> Hi Massimo,  the error is: Cannot operate on a closed database. 
>> ticket: 
>> Traceback (most recent call last): 
>>   File "/home/paolo/Dropbox/git/pp/web2py/gluon/restricted.py", line 
>> 209, in restricted 
>>     exec ccode in environment 
>>   File 
>> "/home/paolo/Dropbox/git/pp/web2py/applications/test_vf/views/default/test.html",
>>  
>>
>> line 3, in <module> 
>>     {{pass}} 
>>   File "/home/paolo/Dropbox/git/pp/web2py/gluon/dal.py", line 8825, in 
>> __call__ 
>>     return self.method(self.row,*args,**kwargs) 
>>   File 
>> "/home/paolo/Dropbox/git/pp/web2py/applications/test_vf/models/db.py", 
>> line 129, in <lambda> 
>>     db.reviews_s.pos = Field.Lazy(lambda row: 
>> db((db.reviews_like_s.review_id == row.reviews_s.id) & 
>> (db.reviews_like_s.helpful == True)).count() ) 
>>   File "/home/paolo/Dropbox/git/pp/web2py/gluon/dal.py", line 8690, in 
>> count 
>>     return db._adapter.count(self.query,distinct) 
>>   File "/home/paolo/Dropbox/git/pp/web2py/gluon/dal.py", line 1597, in 
>> count 
>>     self.execute(self._count(query, distinct)) 
>>   File "/home/paolo/Dropbox/git/pp/web2py/gluon/dal.py", line 1653, in 
>> execute 
>>     return self.log_execute(*a, **b) 
>>   File "/home/paolo/Dropbox/git/pp/web2py/gluon/dal.py", line 1647, in 
>> log_execute 
>>     ret = self.cursor.execute(*a, **b) 
>> ProgrammingError: Cannot operate on a closed database. 
>>
>> I put the code of the simple app in a new app with the latest web2py, 
>> the first time I accessed the page all worked well but 
>> when I reloaded it, I got the error. Hope this can help you. 
>>
>> Best, 
>> Paolo 
>>
>>
>>
>> 2012/8/31 Massimo Di Pierro <massimo....@gmail.com>: 
>> > What's the error? Works for me. 
>> > 
>> > 
>> > On Friday, 31 August 2012 16:00:24 UTC-5, Paolo wrote: 
>> >> 
>> >> Hi Massimo, 
>> >> I made a simple app, accordingly this example the error seems related 
>> >> to the cache, because without the cache all works fine. 
>> >> 
>> >> The model: 
>> >> db.define_table('reviews_like_s', 
>> >>                  Field('review_id', 'reference reviews'), 
>> >>                  Field('helpful', 'boolean')) 
>> >> 
>> >> db.define_table('reviews_s', 
>> >>                 Field('title')) 
>> >> db.reviews_s.pos = Field.Lazy(lambda row: 
>> >> db((db.reviews_like_s.review_id == row.reviews_s.id) & 
>> >> (db.reviews_like_s.helpful == True)).count() ) 
>> >> db.reviews_s.neg = Field.Lazy(lambda row: 
>> >> db((db.reviews_like_s.review_id == row.reviews_s.id) & 
>> >> (db.reviews_like_s.helpful == False)).count() ) 
>> >> 
>> >> 
>> >> Function: 
>> >> def test(): 
>> >>     id = db.reviews_s.insert(title='xxx') 
>> >>     db.reviews_like_s.insert(review_id=id, helpful=True) 
>> >>     rows = db(db.reviews_s.id > 0).select( cache=(cache.ram,3600) ) 
>> >>     return dict(reviews=rows) 
>> >> 
>> >> The view: 
>> >> {{for review in reviews:}} 
>> >>         <p>{{=review.pos()}}</p> 
>> >> {{pass}} 
>> >> 
>> >> On my side the first time works well, the second rises the error. 
>> >> 
>> >> Best, 
>> >> Paolo 
>> >> 
>> >> 
>> >> 2012/8/30 paolo....@gmail.com <paolo....@gmail.com>: 
>> >> > Hi Massimo, 
>> >> > no, I do not have multiple models, I have defined the string 
>> >> > connection only once in db.py, that's all. 
>> >> > I have a few try...except but in other places, I do not thing they 
>> are 
>> >> > connected. 
>> >> > I will try to make a simple app ables to reproduce the problem as 
>> soon 
>> >> > as possible. 
>> >> > 
>> >> > Paolo 
>> >> > 
>> >> > 2012/8/30 Massimo Di Pierro <massimo....@gmail.com>: 
>> >> >> Can you make a simple app to reproduce this? 
>> >> >> 
>> >> >> Do you have try .... except anywhere? Do you have multiple models 
>> wich 
>> >> >> define the same db = DAL(...) connection? 
>> >> >> 
>> >> >> 
>> >> >> On Thursday, 30 August 2012 15:49:01 UTC-5, Paolo wrote: 
>> >> >>> 
>> >> >>> Hi Bruno, a simple db with sqlite without modules 
>> >> >>> 
>> >> >>> db = DAL('sqlite://storage.sqlite', lazy_tables=True ) 
>> >> >>> 
>> >> >>> sorry, but I've just discovered that the same problem is happened 
>> even 
>> >> >>> with lazy_tables=False 
>> >> >>> Paolo 
>> >> >>> 
>> >> >>> 2012/8/30 Bruno Rocha <rocha...@gmail.com>: 
>> >> >>> > How are you defining the db connection? are you using models or 
>> >> >>> > modules? 
>> >> >>> > which db? 
>> >> >>> > 
>> >> >>> > -- 
>> >> >>> > 
>> >> >>> > 
>> >> >>> > 
>> >> >>> 
>> >> >>> 
>> >> >>> 
>> >> >>> -- 
>> >> >>>  Paolo 
>> >> >> 
>> >> >> -- 
>> >> >> 
>> >> >> 
>> >> >> 
>> >> > 
>> >> > 
>> >> > 
>> >> > -- 
>> >> >  Paolo 
>> >> 
>> >> 
>> >> 
>> >> -- 
>> >>  Paolo 
>> > 
>> > -- 
>> > 
>> > 
>> > 
>>
>>
>>
>> -- 
>>  Paolo 
>>
>

-- 



Reply via email to