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

Pymysql Cursor.fetchall() / Fetchone() Returnerer ingen

PyMySQL er et python-bibliotek, der kan oprette forbindelse til MySQL-databasen. Men i disse dage, når jeg udfører select SQL-kommandoen gennem PyMySQL, fandt jeg ud af, at udførelsen ikke returnerer nogen poster fra databasetabellen, men dataene eksisterer virkelig i databasetabellen. Og når jeg kører SQL-kommandoen direkte i databasen, kan SQL'en udføres med succes, og tabeldataene kan returneres korrekt. Nedenfor er grunden til, jeg fandt i mit tilfælde.

1. Vælg SQL-kommandoformål.

Målet med nedenstående SQL-kommando er at returnere antallet af eksisterende poster, hvis brugernavn er 'jerry', hvis optællingstallet er større end 0, betyder det, at posten med betingelsen eksisterer i databasetabellen, så indsættes koden ikke en ny post i MySQL-databasetabel. Men hvis det returnerede antal er 0, betyder det, at data ikke findes i tabellen, så kan vi indsætte det i MySQL-databasetabellen.

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

2. Sådan udføres over SQL Brug PyMySQL.

2.1 Installer PyMySQL-biblioteket.

Hvis du vil udføre ovenstående SQL, skal du bruge PyMySQL, så skal du først installere PyMySQL-biblioteket som nedenfor.

:~$ 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 Kør SQL Brug PyMySQL.

Importer nu PyMySQL-modulet tilslut , markører klasse ind i din Python-kode og udfør ovenstående select SQL-kommando med den. Du kan se kildekoden nedenfor.

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

Når du kører ovenstående python-kildekode, får du Ingen fra udførelsesresultatet. Når du fejlretter kildekoden, kan du opdage, at hvis du tilføjer cursor.fetchall() i eclipse PyDev Expressions fejlfindingsvindue før cursor.fetchall() er påberåbt, kan du se row_count værdi er den korrekte resultatværdi (1) i Udtryk værdi kolonne. Men når du fortsætter med at køre cursor.fetchall() funktion, er det returnerede resultat en tom liste.

Og rækkeantallet returneret af row_count = cursor.execute(sql) kode er heller ikke antallet af registreringer, hvis brugernavn er 'jerry'. Det er kun det returnerede rækkeantal, hvis der er to eller flere poster, hvis brugernavn er 'jerry', er row_count = cursor.execute(sql) er stadig 1.

Efter nogle undersøgelser fandt jeg ud af, at dette problem eksisterer i scenarierne nedenfor.

  1. Eksisterer kun, når jeg fejlretter ovenstående kode, når jeg kører ovenstående kode direkte, er resultatet korrekt.
  2. Manglende forståelse af cursor.fetchall() funktion, vil funktionen flytte til sidste række efter at være blevet aktiveret. Og resultatet vil blive gemt i den midlertidige variabelrække.
  3. Dette er en fejl i PyMySQL eller MySQL, som StackOverflow-emnet henviste til.

Hvis du har fundet andre grunde, bedes du tilføje dine kommentarer til denne artikel, mange tak.


  1. Sådan rettes:"SQLServerAgent kører ikke i øjeblikket ..."

  2. Sådan opretter du forbindelse til MySQL ved hjælp af Microsoft .NET

  3. MySQL-replikering med ProxySQL på WHM/cPanel-servere:Del 1

  4. Hvad gør sp_reset_connection?