Mysql
 sql >> Database >  >> RDS >> Mysql

Pymysql Cursor.fetchall() / Fetchone() Restituisce Nessuno

PyMySQL è una libreria Python in grado di connettersi al database MySQL. Ma in questi giorni, quando eseguo il comando select SQL tramite PyMySQL, ho scoperto che l'esecuzione non restituisce alcun record dalla tabella del database, ma i dati esistono davvero nella tabella del database. E quando eseguo direttamente il comando SQL nel database, l'SQL può essere eseguito correttamente e i dati della tabella possono essere restituiti correttamente. Di seguito è riportato il motivo che ho trovato nel mio caso.

1. Seleziona Scopo del comando SQL.

L'obiettivo del comando SQL seguente è restituire il numero di conteggio dei record esistenti il ​​cui nome_utente è 'jerry', se il numero di conteggio è maggiore di 0 significa che il record con la condizione esiste nella tabella del database, il codice non verrà inserito un nuovo record nella tabella del database MySQL. Ma se il numero di conteggio restituito è 0 significa che i dati non esistono nella tabella, allora possiamo inserirli nella tabella del database MySQL.

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

2. Come eseguire sopra SQL Utilizzare PyMySQL.

2.1 Installa la libreria PyMySQL.

Se vuoi eseguire l'SQL sopra, usa PyMySQL, quindi devi prima installare la libreria PyMySQL come di seguito.

:~$ 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 Esegui SQL Usa PyMySQL.

Ora importa il modulo PyMySQL connect , cursori classe nel tuo codice Python ed esegui il comando SQL select sopra con esso. Puoi vedere il codice sorgente qui sotto.

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

Quando esegui il codice sorgente python sopra, otterrai Nessuno dal risultato dell'esecuzione. Quando esegui il debug del codice sorgente, puoi scoprirlo se aggiungi cursor.fetchall() nell'eclissi PyDev Espressioni finestra di debug prima di cursor.fetchall() viene richiamato, puoi vedere il row_count value è il valore del risultato corretto (1) nelle Espressioni colonna valore. Ma quando continui a eseguire cursor.fetchall() funzione, il risultato restituito è un elenco vuoto.

E il conteggio delle righe restituito da row_count = cursor.execute(sql) il codice non è nemmeno il numero di conteggio record il cui nome_utente è "jerry". È solo il conteggio delle righe restituito dall'esecuzione, se sono presenti due o più record il cui nome_utente è 'jerry' il row_count = cursor.execute(sql) è ancora 1.

Dopo alcune indagini, ho scoperto che questo problema esiste negli scenari seguenti.

  1. Esiste solo quando eseguo il debug del codice sopra, quando eseguo direttamente il codice sopra, il risultato è corretto.
  2. Mancata comprensione di cursor.fetchall() funzione, la funzione si sposterà all'ultima riga dopo essere stata richiamata. E il risultato verrà salvato nella riga della variabile temporanea.
  3. Questo è un bug di PyMySQL o MySQL, come indicato nell'argomento StackOverflow.

Se hai trovato altri motivi, aggiungi i tuoi commenti a questo articolo, grazie mille.