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
example@sqldat.comzhaosong-VirtualBox:~$ 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: example@sqldat.com
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.
- Eksisterer kun, når jeg fejlretter ovenstående kode, når jeg kører ovenstående kode direkte, er resultatet korrekt.
- 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. - 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.