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 <[email protected]> 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.