Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Pymysql Cursor.fetchall() / Fetchone() Zwraca Brak

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.

  1. Istnieje tylko wtedy, gdy debuguję powyższy kod, kiedy uruchamiam powyższy kod bezpośrednio, wynik jest poprawny.
  2. Brak zrozumienia cursor.fetchall() funkcja przejdzie do ostatniego wiersza po wywołaniu. A wynik zostanie zapisany w tymczasowym wierszu zmiennych.
  3. 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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wydajność MySQL:MySQL kontra MariaDB

  2. Czy nazwy tabel w MySQL rozróżniają wielkość liter?

  3. AKTUALIZACJA PHP MYSQL, jeśli istnieje lub INSERT, jeśli nie?

  4. MySQL MariaDB – zapytanie przy użyciu tabeli temp

  5. Jak uzyskać nazwy wszystkich kolumn dla wszystkich tabel w MySQL?