PyMySQL to biblioteka Pythona, która może łączyć się z bazą danych MySQL. Ale w dzisiejszych czasach, kiedy wykonuję polecenie select SQL przez PyMySQL, odkryłem, że wykonanie nie zwraca żadnych rekordów z tabeli bazy danych, ale dane naprawdę istnieją w tabeli bazy danych. A kiedy uruchamiam polecenie SQL bezpośrednio w bazie danych, SQL może zostać wykonany pomyślnie, a dane z tabeli mogą zostać zwrócone poprawnie. Poniżej znajduje się powód, który znalazłem w moim przypadku.
1. Wybierz Cel polecenia SQL.
Celem poniższego polecenia SQL jest zwrócenie liczby istniejących rekordów, których nazwa_użytkownika to 'jerry', jeśli liczba zliczeń jest większa niż 0 oznacza to, że rekord z warunkiem istnieje w tabeli bazy danych, to kod nie zostanie wstawiony nowy rekord w tabeli bazy danych MySQL. Ale jeśli zwrócona liczba wynosi 0, oznacza to, że dane nie istnieją w tabeli, możemy wstawić je do tabeli bazy danych MySQL.
"select count(id) as count from dev2qa_example.user_account where lower(user_name) = 'jerry'"
2. Jak wykonać powyżej SQL Użyj PyMySQL.
2.1 Zainstaluj bibliotekę PyMySQL.
Jeśli chcesz wykonać powyższy SQL przy użyciu PyMySQL, musisz najpierw zainstalować bibliotekę PyMySQL, jak poniżej.
:~$ 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
example@sqldat.comzhaosong-VirtualBox:~$ 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: example@sqldat.com
License: "MIT"
Location: /home/zhaosong/.local/lib/python3.6/site-packages
Requires:
2.2 Uruchom SQL Użyj PyMySQL.
Teraz zaimportuj moduł PyMySQL połącz , kursory do kodu Pythona i wykonaj z nim powyższe polecenie SQL. Możesz zobaczyć poniższy kod źródłowy.
# 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()
Po uruchomieniu powyższego kodu źródłowego Pythona otrzymasz Brak z wyniku wykonania. Podczas debugowania kodu źródłowego możesz się przekonać, że dodasz cursor.fetchall() w zaćmieniu Wyrażenia PyDev okno debugowania przed cursor.fetchall() jest wywoływany, możesz zobaczyć liczbę wierszy wartość jest poprawną wartością wyniku (1) w Wyrażeniach kolumna wartości. Ale kiedy kontynuujesz uruchamianie cursor.fetchall() funkcja, zwrócony wynik jest pustą listą.
I liczba wierszy zwrócona przez row_count = cursor.execute(sql) kod nie jest również liczbą rekordów, których nazwa_użytkownika to „jerry”. Jest to po prostu wykonanie zwróconej liczby wierszy, jeśli istnieją dwa lub więcej rekordów, których nazwa_użytkownika to „jerry” row_count = cursor.execute(sql) to nadal 1.
Po przeprowadzeniu dochodzenia odkryłem, że ten problem występuje w poniższych scenariuszach.
- Istnieje tylko wtedy, gdy debuguję powyższy kod, kiedy uruchamiam powyższy kod bezpośrednio, wynik jest poprawny.
- Brak zrozumienia
cursor.fetchall()funkcja przejdzie do ostatniego wiersza po wywołaniu. A wynik zostanie zapisany w tymczasowym wierszu zmiennych. - Jest to błąd PyMySQL lub MySQL, jak wspomniano w temacie StackOverflow.
Jeśli znalazłeś inne powody, dodaj swoje komentarze do tego artykułu, wielkie dzięki.