Python: Nombre de lignes affectées par le curseur.execute("SELECT ...)
Comment puis-je accéder le nombre de lignes affectées par:
cursor.execute("SELECT COUNT(*) from result where server_state='2' AND name LIKE '"+digest+"_"+charset+"_%'")
- Cette question n'a pas de sens. Une instruction select n'a pas d'incidence sur tous lignes.
- Je pense que l'intention est d'obtenir le nombre de lignes retournées par
COUNT(*)
ce qui signifie que la vraie question est "Comment accéder à la suite decursor.execute
. - Aussi ne jamais, ne JAMAIS utiliser python chaîne de concaténations voir initd.org/psycopg/docs/..., ou vous serez dans le monde de la douleur!
- Ce que @Alex signifie, ne jamais utiliser python concaténation de chaîne à remplacer les valeurs d'une variable dans une chaîne de requête SQL.
- Merci @Larsh 🙂 j'ai voulu dire dans le contexte de requêtes SQL en Python.
Vous devez vous connecter pour publier un commentaire.
Essayez d'utiliser
fetchone
:result
tiendra un tuple avec un seul élément, la valeur deCOUNT(*)
.Donc, pour trouver le nombre de lignes:
Ou, si vous préférez le faire d'un seul coup:
PS. C'est aussi une bonne pratique de l'utilisation paramétrées arguments à chaque fois que possible, car il peut automatiquement citer les arguments pour vous en cas de besoin, et de les protéger contre les injections sql.
La syntaxe correcte pour paramétrées arguments dépend de votre python/adaptateur de base de données (par exemple, mysqldb, psycopg2 ou sqlite3). Il ressemblerait à quelque chose comme
?
syntaxe.De PEP 249, qui est généralement mis en œuvre par Python Api de base de données:
[...]
Mais attention, il continue à dire:
Donc, si vous avez exécuté votre déclaration, et il fonctionne, et vous êtes certains que votre code sera toujours exécuté sur la même version du même SGBD, c'est une solution raisonnable.
COUNT(*)
. Si vous interrogezSELECT name FROM result WHERE server_state='2'
, par exemple, vous obtiendrez zéro, une ou plusieurs lignes.cursor.rowcount == -1
pourSELECT
états car il ne sait pas combien de lignes sera retourné jusqu'à ce que vous avez retourné toutes les lignes; c'est itérateurs tout le chemin vers le bas pour SQLite.rowcount
peut être-1
dans le cas où le nombre de lignes n'a pu être déterminée, mais cette réponse papiers au cours de cette mise en garde. J'ai eu à vérifier si cela a été un ajout ultérieur, mais rowcount pas toujours être mis fait partie, depuis la première PEP s'engager à partir de 2001.None
à l'avenir, je pense maintenant que ce n'est pas vraiment une bonne solution pour mon cas. Alors votre suggestion m'a sauvé de l'avenir possible de bugs.Le nombre de lignes affectées est retourné à partir de l'exécuter:
bien sûr, comme AndiDog déjà mentionné, vous pouvez obtenir le nombre de ligne en accédant à la propriété rowcount du curseur à tout moment pour obtenir le nombre de la dernière exécution:
À partir de la ligne de la documentation de python MySQLdb:
cursor.execute
méthode n'est plus défini (dans la version précédente de la norme, il était prévu de travailler comme dans Boaz exemple). La spécification explicite suggère l'utilisation de la le plus flexible .rowcount attribut au lieu que la valeur retournée par laexecute
méthode est l'interface de base de données dépendant de l'implémentation.cursor.rowcount
peut être laissé à-1
. Le PEP spécification des feuilles à l'adaptateur de base de données, de sorte qu'il n'est pas garanti de fonctionner pour toutes les bases de données. La valeur de retour decursor.execute()
n'est pas prescrit par la PPE, et certains pilotes de base de données (commesqlite3
) retour du curseur, pas un nombre de lignes.À mon avis, la façon la plus simple d'obtenir la quantité de lignes sélectionnées est la suivante:
Le curseur de l'objet renvoie une liste avec les résultats lors de l'utilisation de l'extraction de commandes (fetchall(), fetchone(), fetchmany()). Pour obtenir les lignes sélectionnées, il suffit d'imprimer la longueur de cette liste. Mais il est tout à fait logique pour fetchall(). 😉
Exemple:
cursor.fetchall
ici, donc le code littéral, comme l'a écrit, produit une erreur de type. Et pourquoi aller chercher toutes les lignes juste à utiliserlen()
sur la liste? C'est juste un gaspillage de ressources. UtilisationSELECT COUNT(*)
que le serveur ne le dépouillement.