web-dev-qa-db-fra.com

Comment puis-je obtenir le nombre de lignes affectées à partir de psycopg2 connection.commit ()?

Actuellement, j'ai la méthode suivante pour exécuter les instructions INSERT/UPDATE/DELETE en utilisant psycopg2 Dans 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

Mais ce que j'aimerais vraiment qu'il fasse, au lieu de booléen, c'est de retourner le nombre de lignes affecté par la transaction ou -1 si l'opération échoue.

Existe-t-il un moyen d'obtenir un certain nombre de lignes affectées par _cxn.commit()? Par exemple. pour un seul INSERT, ce serait toujours 1, pour un DELETE ou UPDATE, le nombre de lignes affectées par l'instruction etc.?

33
amphibient

commit() ne peut pas être utilisé pour obtenir le nombre de lignes, mais vous pouvez utiliser cursor pour obtenir ces informations après chaque appel à execute. Vous pouvez utiliser son attribut rowcount pour obtenir le nombre de lignes affectées pour SELECT, INSERT, UPDATE et DELETE.

c'est à dire.

    db_crsr = _cxn.cursor()
    db_crsr.execute(_stmt)

    rowcount = db_crsr.rowcount

    _cxn.commit()
    db_crsr.close()

    return rowcount

Si vous souhaitez renvoyer le nombre de lignes affectées, je vous recommande de ne pas intercepter d'exceptions, car si l'opération a vraiment échoué (disons que la requête a été malformée ou qu'il y a eu une violation de contrainte FK, etc.), une exception doit être levée, et dans ce cas, l'appelant pourrait attraper cela et se comporter comme vous le souhaitez. (Ou, si vous souhaitez centraliser la gestion des exceptions, peut-être raise un MyPostgresException personnalisé ou similaire.)

-1 peut être retourné en cas de non-échec dans certaines situations ( http://initd.org/psycopg/docs/cursor.html#cursor.rowcount ), donc je vous déconseille de l'utiliser comme indicateur de défaillance. Si vous voulez vraiment retourner une valeur numérique en cas d'échec, peut-être que retourner un nombre comme -10 fonctionnerait (dans le bloc except), puisque rowcount ne devrait jamais le retourner.

55
khampson