Python: Nombre de lignes affectées par cursor.execute ( "SELECT ...)
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+"_%'")
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)