Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Pymysql Cursor.fetchall() / Fetchone() Gibt „Keine“ zurück

PyMySQL ist eine Python-Bibliothek, die eine Verbindung zur MySQL-Datenbank herstellen kann. Aber wenn ich heutzutage den Select-SQL-Befehl über PyMySQL ausführe, habe ich festgestellt, dass die Ausführung keine Datensätze aus der Datenbanktabelle zurückgibt, aber die Daten wirklich in der Datenbanktabelle vorhanden sind. Und wenn ich den SQL-Befehl direkt in der Datenbank ausführe, kann die SQL erfolgreich ausgeführt werden und die Tabellendaten können korrekt zurückgegeben werden. Unten ist der Grund, den ich in meinem Fall gefunden habe.

1. Wählen Sie den Zweck des SQL-Befehls aus.

Das Ziel des folgenden SQL-Befehls besteht darin, die Anzahl der vorhandenen Datensätze zurückzugeben, deren Benutzername „Jerry“ ist. Wenn die Anzahl größer als 0 ist, bedeutet dies, dass der Datensatz mit der Bedingung in der Datenbanktabelle vorhanden ist, der Code wird nicht eingefügt einen neuen Datensatz in die MySQL-Datenbanktabelle. Wenn die zurückgegebene Zählnummer jedoch 0 ist, bedeutet dies, dass die Daten nicht in der Tabelle vorhanden sind, dann können wir sie in die MySQL-Datenbanktabelle einfügen.

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

2. Wie man obiges SQL ausführt Verwenden Sie PyMySQL.

2.1 PyMySQL-Bibliothek installieren.

Wenn Sie das obige SQL mit PyMySQL ausführen möchten, müssen Sie zuerst die PyMySQL-Bibliothek wie unten installieren.

:~$ 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 SQL ausführen Verwenden Sie PyMySQL.

Importieren Sie nun das PyMySQL-Modul connect , Cursor class in Ihren Python-Code und führen Sie damit den obigen select SQL-Befehl aus. Sie können den folgenden Quellcode sehen.

# 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()

Wenn Sie den obigen Python-Quellcode ausführen, erhalten Sie None aus dem Ausführungsergebnis. Wenn Sie den Quellcode debuggen, können Sie das feststellen, wenn Sie cursor.fetchall() hinzufügen in den Eclipse-PyDev-Ausdrücken Debug-Fenster vor cursor.fetchall() aufgerufen wird, können Sie den row_count sehen value ist der korrekte Ergebniswert (1) in den Ausdrücken Wertspalte. Aber wenn Sie weiterhin cursor.fetchall() ausführen -Funktion ist das zurückgegebene Ergebnis eine leere Liste.

Und die Zeilenanzahl, die von row_count = cursor.execute(sql) zurückgegeben wird Code ist auch nicht die Datensatzzählungsnummer, deren Benutzername „Jerry“ ist. Es ist nur die Anzahl der von der Ausführung zurückgegebenen Zeilen, wenn es zwei oder mehr Datensätze gibt, deren Benutzername „Jerry“ ist, row_count = cursor.execute(sql) ist immer noch 1.

Nach einigen Untersuchungen habe ich festgestellt, dass dieses Problem in den folgenden Szenarien existiert.

  1. Existieren nur, wenn ich den obigen Code debugge, wenn ich den obigen Code direkt ausführe, ist das Ergebnis korrekt.
  2. Missverständnis von cursor.fetchall() Funktion wird die Funktion nach dem Aufruf in die letzte Zeile verschoben. Und das Ergebnis wird in der temporären Variablenzeile gespeichert.
  3. Dies ist ein Fehler von PyMySQL oder MySQL, wie im StackOverflow-Thema erwähnt.

Wenn Sie andere Gründe gefunden haben, fügen Sie bitte Ihre Kommentare zu diesem Artikel hinzu, vielen Dank.