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.?
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.