Mysql
 sql >> Base de données >  >> RDS >> Mysql

Pymysql Cursor.fetchall() / Fetchone() ne renvoie aucun

PyMySQL est une bibliothèque python qui peut se connecter à la base de données MySQL. Mais ces jours-ci, lorsque j'exécute la commande select SQL via PyMySQL, j'ai constaté que l'exécution ne renvoyait aucun enregistrement de la table de la base de données, mais les données existent réellement dans la table de la base de données. Et lorsque j'exécute directement la commande SQL dans la base de données, le SQL peut s'exécuter avec succès et les données de la table peuvent être renvoyées correctement. Voici la raison que j'ai trouvée dans mon cas.

1. Sélectionnez Objectif de la commande SQL.

L'objectif de la commande SQL ci-dessous est de renvoyer le nombre d'enregistrements existants dont le nom d'utilisateur est 'jerry', si le nombre est supérieur à 0, cela signifie que l'enregistrement avec la condition existe dans la table de base de données, alors le code ne sera pas inséré un nouvel enregistrement dans la table de la base de données MySQL. Mais si le nombre de comptage renvoyé est 0, cela signifie que les données n'existent pas dans la table, nous pouvons alors les insérer dans la table de la base de données MySQL.

"select count(id) as count from dev2qa_example.user_account where lower(user_name) = 'jerry'"

2. Comment exécuter au-dessus de SQL Utilisez PyMySQL.

2.1 Installer la bibliothèque PyMySQL.

Si vous souhaitez exécuter le SQL ci-dessus, utilisez PyMySQL, vous devez d'abord installer la bibliothèque PyMySQL comme ci-dessous.

:~$ pip3 install PyMySQL
Collecting PyMySQL
  Downloading https://files.pythonhosted.org/packages/ed/39/15045ae46f2a123019aa968dfcba0396c161c20f855f11dea6796bcaae95/PyMySQL-0.9.3-py2.py3-none-any.whl (47kB)
    100% |████████████████████████████████| 51kB 152kB/s 
Installing collected packages: PyMySQL
Successfully installed PyMySQL-0.9.3
[email protected]:~$ pip3 show PyMySQL
Name: PyMySQL
Version: 0.9.3
Summary: Pure Python MySQL Driver
Home-page: https://github.com/PyMySQL/PyMySQL/
Author: yutaka.matsubara
Author-email: [email protected]
License: "MIT"
Location: /home/zhaosong/.local/lib/python3.6/site-packages
Requires: 

2.2 Exécuter SQL Utilisez PyMySQL.

Importez maintenant le module PyMySQL connect , curseurs class dans votre code Python et exécutez la commande SQL select ci-dessus avec celle-ci. Vous pouvez voir le code source ci-dessous.

# import pymysql connect and cursors class.
from pymysql import connect, cursors

# get mysql connection object.
conn = connect(host='127.0.0.1', user='root', password='root', db='dev2qa_example', charset='utf8', cursorclass=cursors.DictCursor)

try:
    # get database cursor object.
    with conn.cursor() as cursor:
         # execute select sql command.
         row_count = cursor.execute(sql)
         print('select return row count = ' + str(row_count))
         # get the execution result and print it out.
         row = cursor.fetchall()
         print(row)
finally:
   # do not forget close mysql connection at the end of the code.
   conn.close()

Lorsque vous exécutez le code source python ci-dessus, vous obtiendrez Aucun du résultat de l'exécution. Lorsque vous déboguez le code source, vous pouvez constater que si vous ajoutez cursor.fetchall() dans l'éclipse PyDev Expressions fenêtre de débogage avant cursor.fetchall() est appelé, vous pouvez voir le row_count value est la valeur de résultat correcte (1) dans les Expressions colonne de valeur. Mais lorsque vous continuez à exécuter le cursor.fetchall() fonction, le résultat renvoyé est une liste vide.

Et le nombre de lignes renvoyé par row_count = cursor.execute(sql) code n'est pas non plus le nombre d'enregistrements dont le nom d'utilisateur est 'jerry'. C'est juste le nombre de lignes renvoyées par l'exécution, s'il y a deux enregistrements ou plus dont le nom d'utilisateur est 'jerry' le row_count = cursor.execute(sql) est toujours 1.

Après quelques recherches, j'ai découvert que ce problème existait dans les scénarios ci-dessous.

  1. N'existe que lorsque je débogue le code ci-dessus, lorsque j'exécute le code ci-dessus directement, le résultat est correct.
  2. Mauvaise compréhension de cursor.fetchall() fonction, la fonction passera à la dernière ligne après avoir été invoquée. Et le résultat sera enregistré dans la ligne de variable temporaire.
  3. Il s'agit d'un bogue de PyMySQL ou MySQL, comme le mentionne le sujet StackOverflow.

Si vous avez trouvé d'autres raisons, veuillez ajouter vos commentaires à cet article, merci beaucoup.