Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Pymysql Cursor.fetchall() / Fetchone() Mengembalikan Tidak Ada

PyMySQL adalah pustaka python yang dapat terhubung ke database MySQL. Tetapi hari-hari ini ketika saya menjalankan perintah SQL pilih melalui PyMySQL, saya menemukan bahwa eksekusi tidak mengembalikan catatan apa pun dari tabel database, tetapi data benar-benar ada di tabel database. Dan ketika saya menjalankan perintah SQL di database secara langsung, SQL dapat dijalankan dengan sukses dan data tabel dapat dikembalikan dengan benar. Di bawah ini adalah alasan yang saya temukan dalam kasus saya.

1. Pilih Tujuan Perintah SQL.

Tujuan dari perintah SQL di bawah ini adalah untuk mengembalikan jumlah record yang ada yang user_name-nya 'jerry', jika angka count lebih besar dari 0 itu berarti record dengan kondisi ada di tabel database, maka kode tidak akan disisipkan record baru ke dalam tabel database MySQL. Namun jika angka hitung yang dikembalikan adalah 0 artinya data tersebut tidak ada di tabel, maka kita bisa memasukkannya ke dalam tabel database MySQL.

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

2. Cara Mengeksekusi SQL Di Atas Gunakan PyMySQL.

2.1 Instal Pustaka PyMySQL.

Jika Anda ingin mengeksekusi SQL di atas menggunakan PyMySQL, maka Anda perlu menginstal pustaka PyMySQL terlebih dahulu seperti di bawah ini.

:~$ 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 Jalankan SQL Gunakan PyMySQL.

Sekarang impor modul PyMySQL hubungkan , kursor kelas ke dalam kode Python Anda dan jalankan perintah SQL pilih di atas dengannya. Anda dapat melihat kode sumber di bawah ini.

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

Saat Anda menjalankan kode sumber python di atas, Anda akan mendapatkan Tidak Ada dari hasil eksekusi. Saat Anda men-debug kode sumber, Anda dapat menemukannya jika Anda menambahkan cursor.fetchall() di gerhana PyDev Ekspresi jendela debug sebelum cursor.fetchall() dipanggil, Anda dapat melihat row_count value adalah nilai hasil yang benar (1) di Ekspresi kolom nilai. Tetapi ketika Anda terus menjalankan cursor.fetchall() fungsi, hasil yang dikembalikan adalah daftar kosong.

Dan jumlah baris yang dikembalikan oleh row_count = cursor.execute(sql) kode juga bukan nomor hitungan catatan yang nama_penggunanya adalah 'jerry'. Itu hanya eksekusi yang mengembalikan jumlah baris, jika ada dua atau lebih record yang user_name-nya adalah 'jerry' row_count = cursor.execute(sql) masih 1.

Setelah beberapa penyelidikan, saya menemukan masalah ini ada dalam skenario di bawah ini.

  1. Hanya ada ketika saya men-debug kode di atas, ketika saya menjalankan kode di atas secara langsung, hasilnya benar.
  2. Kehilangan pemahaman tentang cursor.fetchall() fungsi, fungsi akan pindah ke baris terakhir setelah dipanggil. Dan hasilnya akan disimpan di baris variabel sementara.
  3. Ini adalah bug dari PyMySQL atau MySQL, seperti yang dirujuk oleh topik StackOverflow.

Jika Anda menemukan alasan lain, silakan tambahkan komentar Anda ke artikel ini, terima kasih banyak.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara memasukkan bingkai data panda melalui mysqldb ke dalam database?

  2. Bagaimana cara mengubah kolom dan mengubah nilai default?

  3. Cara Mengganti Nama Tabel di MySQL

  4. Impor Data dari Excel Spreadsheet atau CVS ke MySQL

  5. MySQL:Pilih Entri Acak, tetapi Bobot Menuju Entri Tertentu