try query len examples python psycopg2

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.