web-dev-qa-db-fra.com

Python: Nombre de lignes affectées par cursor.execute ("SELECT ...)

Comment puis-je accéder au nombre de lignes affectées par:

cursor.execute("SELECT COUNT(*) from result where server_state='2' AND name LIKE '"+digest+"_"+charset+"_%'")
47
Tie-fighter

Essayez d'utiliser fetchone:

cursor.execute("SELECT COUNT(*) from result where server_state='2' AND name LIKE '"+digest+"_"+charset+"_%'")
result=cursor.fetchone()

result tiendra un Tuple avec un élément, la valeur de COUNT(*). Donc pour trouver le nombre de lignes:

number_of_rows=result[0]

Ou, si vous préférez le faire d'un seul coup:

cursor.execute("SELECT COUNT(*) from result where server_state='2' AND name LIKE '"+digest+"_"+charset+"_%'")
(number_of_rows,)=cursor.fetchone()

PS Il est également bon d’utiliser des arguments paramétrés chaque fois que possible, car il peut automatiquement citer des arguments pour vous en cas de besoin et se protéger contre l’injection SQL.

La syntaxe correcte pour les arguments paramétrés dépend de votre adaptateur python/database (par exemple, mysqldb, psycopg2 ou sqlite3). Ça ressemblerait à quelque chose comme

cursor.execute("SELECT COUNT(*) from result where server_state= %s AND name LIKE %s",[2,digest+"_"+charset+"_%"])
(number_of_rows,)=cursor.fetchone()
66
unutbu

From PEP 249 , qui est généralement implémenté par Python API de base de données:

Les objets de curseur doivent répondre aux méthodes et attributs suivants:

[…]

.rowcount
Cet attribut en lecture seule spécifie le nombre de lignes que la dernière .execute * () a produites (pour les instructions DQL telles que 'select') ou affectées (pour les instructions DML telles que 'update' ou 'insert').

Mais faites attention, cela continue:

L'attribut est -1 si aucun .execute*() n'a été exécuté sur le curseur ou si le nombre de lignes de la dernière opération n'a pas pu être déterminé par l'interface. [7]

Remarque:
Les futures versions de la spécification API de base de données pourraient redéfinir le dernier cas pour que l'objet renvoie None au lieu de -1.

Donc, si vous avez exécuté votre instruction, et cela fonctionne, et vous êtes certain que votre code sera toujours exécuté sur la même version du même SGBD. , c’est une solution raisonnable.

87
AndiDog

Le nombre de lignes effectuées est renvoyé par execute:

rows_affected=cursor.execute("SELECT ... ")

bien sûr, comme AndiDog l'a déjà mentionné, vous pouvez obtenir le nombre de lignes en accédant à tout moment à la propriété rowcount du curseur pour obtenir le nombre de la dernière exécution:

cursor.execute("SELECT ... ")
rows_affected=cursor.rowcount

Dans la documentation en ligne de python MySQLdb:

 def execute(self, query, args=None):

    """Execute a query.

    query -- string, query to execute on server
    args -- optional sequence or mapping, parameters to use with query.

    Note: If args is a sequence, then %s must be used as the
    parameter placeholder in the query. If a mapping is used,
    %(key)s must be used as the placeholder.

    Returns long integer rows affected, if any

    """
36
Boaz

À mon avis, le moyen le plus simple d’obtenir le nombre de lignes sélectionnées est le suivant:

L'objet curseur renvoie une liste des résultats lors de l'utilisation des commandes fetch (fetchall (), fetchone (), fetchmany ()). Pour obtenir les lignes sélectionnées, imprimez simplement la longueur de cette liste. Mais cela a du sens pour fetchall (). ;-)

Exemple:

print len(cursor.fetchall) 
16
harvey_c