Question

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+"_%'")
Était-ce utile?

La solution

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ées chaque fois que possible, car il peut citer automatiquement les arguments pour vous en cas de besoin, et la protection contre l'injection sql.

La syntaxe correcte des arguments paramétrées dépend de votre adaptateur python / base de données (par exemple mysqldb, psycopg2 ou sqlite3). Il 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()

Autres conseils

De PEP 249 , qui est généralement mis en œuvre par les API de base de données Python :

  

Objets du curseur doivent répondre aux méthodes et attributs suivants:

[...]

  

.rowcount
             Cet attribut lecture seule indique le nombre de lignes que la dernière .Execute * () produit (pour les états DQL comme « select ») ou affecté (pour les déclarations DML comme « mise à jour » ou « insert »).

Mais attention, il poursuit en disant:

  

L'attribut est -1 dans le cas où aucun .execute*() a été réalisée sur le curseur ou le nombre de lignes de la dernière opération ne peut être déterminée par l'interface. [7]

     

Remarque:   Les futures versions de la spécification API DB pourrait redéfinir ce dernier cas d'avoir le retour d'objet None au lieu de -1.

Donc, si vous avez exécuté votre déclaration, et il fonctionne, et vous êtes certain que votre code sera toujours être exécuté sur la même version du même SGBD, c'est une solution raisonnable.

Le nombre de lignes est effectuée de passer exécuter:

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

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

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

De la documentation en ligne de MySQLdb python:

 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

    """

A mon avis, la façon la plus simple pour obtenir la quantité de lignes sélectionnées est la suivante:

L'objet curseur retourne une liste avec les résultats en utilisant les commandes fetch (fetchall (), fetchOne (), fetchmany ()). Pour obtenir les lignes sélectionnées imprimer simplement la longueur de cette liste. Mais il est logique pour fetchall (). ; -)

Exemple:

print len(cursor.fetchall) 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top