Actualmente, tengo el siguiente método para ejecutar INSERT/UPDATE/DELETE utilizando 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 hacer, en lugar de bool, es devolver el número de filas afectadas por la transacción o -1 si la operación falla.

Es allí una manera de conseguir un número de filas afectadas por _cxn.commit()? E. g. para un solo INSERTAR sería siempre 1, por un DELETE o UPDATE, el número de filas afectadas por la declaración etc.?

InformationsquelleAutor amphibient | 2014-06-26

1 Comentario

  1. 50

    commit() no puede ser utilizado para obtener el recuento de filas, pero usted puede utilizar el cursor para conseguir que la información después de cada execute llamada. Usted puede utilizar su rowcount atributo para obtener el número de filas afectadas por 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 quieres devolver el número de filas afectadas, yo recomendaría que no la captura de excepciones, ya que si la operación verdaderamente error (dicen que la consulta era incorrecto, o que hubo una FK a la violación de la restricción, etc.), una excepción debe ser planteado, y en caso de que la persona que llama puede coger y se comportan como se desee. (O, si se quiere centralizar el manejo de excepciones, tal vez raise una costumbre MyPostgresException, o similar).

    -1 puede ser devuelto en un no-caso de falla en ciertas situaciones (http://initd.org/psycopg/docs/cursor.html#cursor.rowcount), así que yo recomendaría no utilizar ese valor como indicador de falla. Si usted realmente desea devolver un valor numérico en el caso de que no, tal vez de devolver un número como de -10 iba a funcionar (en el except bloque), ya que rowcount no volver jamás que.

    • Te damos buenas razones para no capturar excepciones, pero hay una razón por la que db_crsr.close() no está en un finally bloque? Va a caer fuera del ámbito al final del método.
    • Nope. Que fue de la OP del código original, y no me he centrado en ese aspecto. En este caso en particular, probablemente yo en realidad declarar la cursor en un with bloque, por lo que sería de cierre automático.
    • Tonto de mí. Olvidar with. =) Necesito más de Python en mi vida.
    • Sí, esto es sólo sobre el caso perfecto para ella, IMO-compacto de la función donde se encuentra el cursor es de corta duración y sólo hay uno de los involucrados.

Dejar respuesta

Please enter your comment!
Please enter your name here