In web2py, each request is wrapped in a single database transaction -- that way if an error occurs somewhere in the processing of the request, any database changes can be rolled back automatically. It would not be desirable to immediately commit each change (i.e., each insert, update, delete, etc.) by default because when an error occurs during a request, you could end up with only partial (and therefore inconsistent) changes. If you need more fine-grained, control, though, you can call db.commit() and db.rollback() as necessary.
Anthony On Friday, March 23, 2012 12:58:22 PM UTC-4, www.diazluis.com wrote: > > Greetings sr. > Thanks for your time. > > your explanation makes sense but ... > > but I find it annoying to have to be running explicitly "db.commit ()" > something as simple as what you showed you > > Waste time having to revise the code to see where failure to use > "db.commit ()" and so and keep it from bouncing an error like the one > mentioned. > > DAL internally in each operation should execute "db.commit ()" or > something (I have no technical knowledge to give a solution working) > > > I justify the use of "db.commit ()" > * If my app estubiera overloaded with queries to the database > * Tubiera a background process working with the database > * Operations on the database from a cycle "for" > > but NOT in the following steps: > 1) check if a record exists > 2) create the record if necessary > 3) re-check the registry, to be used in crud.update > > I find that something is wrong > > > > El viernes 23 de marzo de 2012 09:24:41 UTC-4:30, Richard escribió: >> >> Most of the time in web2py you don't need to commit, but in particular >> scenario you maybe need to commit before an other operation because you >> need the database to be up to date before the and of your function. >> >> http://web2py.com/books/default/chapter/29/6?search=db.commit%28%29<http://web2py.com/books/default/chapter/29/6?search=db.commit%28%29> >> >> Hope it helps >> >> >> The following code gives me error if not explicitly use db.commit () >>> can someone explain why I now need to use db.commit () to something so >>> simple? >>> >>> models/home.py >>> >>> ############## >>> id_user = (auth.user and auth.user.id) or None >>> >>> db.define_table('home', >>> Field('titulo', 'string', length=64, default='titulo de prueba'), >>> Field('texto', 'text', length=5000, default='texto de prueba'), >>> Field('user', db.auth_user, default=id_user, writable=False, >>> readable=False), >>> >>> #auditoria >>> Field('ip', 'string', length=64, default=request.client, >>> update=request.client, writable=False, readable=False), >>> Field('fecha', 'date',default=request.now, update=request.now, >>> writable=False, readable=False), >>> Field('user_update', db.auth_user, default=id_user, >>> update=id_user, writable=False, readable=False), >>> ) >>> ############ >>> >>> >>> controllers/default.py >>> ############## >>> def index(): >>> >>> if auth.is_logged_in() : >>> home = db.home(user=id_user) >>> if home is None: redirect(URL('update')) >>> >>> return dict() >>> >>> >>> @auth.requires_login() >>> def update(): >>> >>> home = db.home(user=id_user) >>> >>> if home is None: >>> home_id = db.home.insert(user=id_user) >>> else: >>> home_id = home.id >>> >>> # db.commit() >>> form = crud.update(db.home, home_id, deletable=False, >>> next=URL('update')) >>> >>> return dict(home=home, form=form) >>> ############# >>> >>> >>> view/default/update.html >>> >>> {{extend 'layout.html'}} >>> >>> <div> >>> <span id="span_home_titulo">{{ =home.titulo }}</span> >>> </div> >>> <div id="form_home" > >>> {{=form.custom.begin}} >>> {{ =form.custom.widget.titulo }} >>> {{ =form.custom.widget.texto }} >>> <input type="submit" value="Save" /> >>> {{=form.custom.end}} >>> </div> >>> >>> ############### >>> >>> >>> Error >>> ######### >>> >>> web2py™ (1, 99, 7, datetime.datetime(2012, 3, 4, 22, 12, 8), 'stable') >>> Python Python 2.6.6: /usr/bin/python >>> TRACEBACK >>> >>> Traceback (most recent call last): >>> File "/home/diazluis2007/web2py/gluon/restricted.py", line 205, in >>> restricted >>> exec ccode in environment >>> File >>> "/home/diazluis2007/web2py/applications/about/views/default/update.html", >>> line 80, in <module> >>> AttributeError: 'NoneType' object has no attribute 'titulo' >>> >>> >>> >>> Díaz Luis >>> Analista Programador Facultad de Odontología UC >>> http://www.about.me/diazluis >>> User Linux 532223 >>> >> >>

