In this try: #1 except: # 2
if #1 fails because it violates a constraint, than you need to rollback before you can access the database again. Try this: try: #1 db.commit() except: db.rollback() # 2 db.commit() It is not a good idea to use try...except in database operations anyway. On Jun 3, 5:05 pm, mmartinez <alexra...@gmail.com> wrote: > Good afternoon, my question is this, there is a postgres sql query > that does not work, I am doing the query q is: > > for r in rws: > try: > db.ratecltes.insert(id_rutas=r.rutas.id, > id_clte=r.clientes.id, rate=r.rutaproveedor.valor) > except: > # # # HERE IS THE ERROR # # # > query=((db.ratecltes.id_rutas==r.rutas.id) & > (db.ratecltes.id_clte==r.clientes.id)) > db(query).update(rate=int(r.rutaproveedor.valor)) > > Web2py The message sent is as follows. > > File "/home/marcelo/web2py/applications/administrador/controllers/ > default.py", line 1087, in cargar_tarifas > db(query).update(rate=int(r.rutaproveedor.valor)) > File "/home/marcelo/web2py/gluon/sql.py", line 3285, in update > self._db._execute(query) > File "/home/marcelo/web2py/gluon/sql.py", line 958, in <lambda> > self._execute = lambda *a, **b: self._cursor.execute(*a, **b) > InternalError: transacción abortada, las órdenes serán ignoradas hasta > el fin de bloque de transacción > > PostgreSQL modify the settings to see the log_statement = all, and > this is the result: > > 2010-06-03 16:31:52 CLT ERROR: transacción abortada, las órdenes > serán ignoradas hasta el fin de bloque de transacción > 2010-06-03 16:31:52 CLT SENTENCIA: UPDATE ratecltes SET rate=60.0 > WHERE (ratecltes.id_rutas=1 AND ratecltes.id_clte=3); > 2010-06-03 16:32:51 CLT WARNING: ya hay una transacción en curso > 2010-06-03 16:32:51 CLT WARNING: ya hay una transacción en curso > 2010-06-03 16:32:54 CLT WARNING: ya hay una transacción en curso > 2010-06-03 16:33:00 CLT WARNING: ya hay una transacción en curso > 2010-06-03 16:33:00 CLT ERROR: llave duplicada viola restricción de > unicidad «ratecltes_ndx» > 2010-06-03 16:33:00 CLT SENTENCIA: INSERT INTO ratecltes(id_rutas, > id_clte, rate) VALUES (1, 3, 60.0); > 2010-06-03 16:33:00 CLT ERROR: transacción abortada, las órdenes > serán ignoradas hasta el fin de bloque de transacción > 2010-06-03 16:33:00 CLT SENTENCIA: UPDATE ratecltes SET rate=60.0 > WHERE (ratecltes.id_rutas=1 AND ratecltes.id_clte=3); > > I hope I can help, not that I'm failing.