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 [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 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.