Hi Massimo, first of all thank you for spending time on it! The first test ends as the others, namely the first time it works, then it raises an error. The the second test works without any problem :-) To solve the issue, I will change the code to follow what you have suggested in the second test.
Cheers, Paolo 2012/9/1 Massimo Di Pierro <massimo.dipie...@gmail.com>: > One more test: > > def getdb(): return db > db.reviews.pos = Field.Lazy(lambda row,db=getdb: > db()((db().reviews_like.review_id == row.reviews.id) & > (db().reviews_like.helpful == True)).count() ) > db.reviews.neg = Field.Lazy(lambda row,db=getdb: > db()((db().reviews_like.review_id == row.reviews.id) & > (db().reviews_like.helpful == False)).count() ) > > Notice you can also do > > db.reviews.pos = Field.Virtual(lambda row: db((db.reviews_like.review_id == > row.reviews.id) & (db.reviews_like.helpful == True)).count() ) > db.reviews.neg = Field.Virtual(lambda row: db((db.reviews_like.review_id == > row.reviews.id) & (db.reviews_like.helpful == False)).count() ) > > and use rows.pos instead of rows.pos() > > In this case the value is cached, not the callback function. > > > On Saturday, 1 September 2012 07:40:20 UTC-5, Paolo wrote: >> >> Hi Massimo, >> I've just tried both strategies you suggested but I got the same >> behavior; namely the first time it works, the second rises the error. >> >> Paolo >> >> 2012/9/1 Massimo Di Pierro <massimo....@gmail.com>: >> > 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 >> > >> > -- >> > >> > >> > >> >> >> >> -- >> Paolo > > -- > > > -- Paolo --