python - query - psycopg2 windows
¿Cómo puedo obtener el recuento de filas afectadas de psycopg2 connection.commit()? (1)
Actualmente, tengo el siguiente método para ejecutar sentencias INSERT / UPDATE / DELETE usando psycopg2
en Python
:
def exec_statement(_cxn, _stmt):
try:
db_crsr = _cxn.cursor()
db_crsr.execute(_stmt)
_cxn.commit()
db_crsr.close()
return True
except:
return False
Pero lo que realmente me gustaría que hiciera, en lugar de bool, es devolver el conteo de filas afectado por la transacción o -1 si la operación falla.
¿Hay alguna manera de obtener un número de filas afectadas por _cxn.commit()
? Por ejemplo, para un solo INSERT, siempre será 1, para DELETE o UPDATE, el número de filas afectadas por la declaración, etc.
commit()
no se puede usar para obtener el recuento de filas, pero puede usar el cursor
para obtener esa información después de cada llamada de execute
. Puede usar su atributo de rowcount
de filas para obtener el número de filas afectadas para SELECT
, INSERT
, UPDATE
y DELETE
.
es decir
db_crsr = _cxn.cursor()
db_crsr.execute(_stmt)
rowcount = db_crsr.rowcount
_cxn.commit()
db_crsr.close()
return rowcount
Si desea devolver el número de filas afectadas, le recomendaría que no detecte ninguna excepción, ya que si la operación realmente falló (digamos que la consulta tenía un formato incorrecto o si hubo una infracción de restricción de FK, etc.), debería producirse una excepción. y en ese caso la persona que llama podría atrapar eso y comportarse como lo desea. (O, si desea centralizar el manejo de excepciones, quizás MyPostgresException
una MyPostgresException
personalizada MyPostgresException
, o similar).
-1 puede devolverse en un caso de no falla en ciertas situaciones ( http://initd.org/psycopg/docs/cursor.html#cursor.rowcount ), por lo que recomendaría no usar ese valor como indicador de falla. Si realmente desea devolver un valor numérico en el caso de una falla, tal vez devolver un número como -10 funcionaría (en el bloque de except
), ya que el rowcount
nunca debería devolver eso.