PyMySQL je python knihovna, která se může připojit k databázi MySQL. Ale v těchto dnech, když jsem provedl příkaz select SQL přes PyMySQL, zjistil jsem, že provedení nevrací žádné záznamy z databázové tabulky, ale data v databázové tabulce skutečně existují. A když spustím příkaz SQL přímo v databázi, SQL se může úspěšně spustit a data tabulky mohou být vrácena správně. Níže je uveden důvod, který jsem našel v mém případě.
1. Vyberte Účel příkazu SQL.
Cílem níže uvedeného příkazu SQL je vrátit počet existujících záznamů, jejichž uživatelské_jméno je 'jerry', pokud je číslo počtu větší než 0, znamená to, že záznam s podmínkou existuje v databázové tabulce, pak se kód nevloží nový záznam do databázové tabulky MySQL. Pokud je ale vrácené číslo počtu 0, znamená to, že data v tabulce neexistují, můžeme je vložit do databázové tabulky MySQL.
"select count(id) as count from dev2qa_example.user_account where lower(user_name) = 'jerry'"
2. Jak spustit nad SQL Použijte PyMySQL.
2.1 Instalace knihovny PyMySQL.
Pokud chcete provést výše uvedené SQL pomocí PyMySQL, musíte nejprve nainstalovat knihovnu PyMySQL, jak je uvedeno níže.
:~$ 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 Spuštění SQL Použijte PyMySQL.
Nyní importujte modul PyMySQL připojit , kurzory třídy do vašeho kódu Pythonu a spusťte s ním výše uvedený příkaz SQL. Níže můžete vidět zdrojový kód.
# 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()
Když spustíte výše uvedený zdrojový kód pythonu, dostanete Žádný z výsledku exekuce. Když ladíte zdrojový kód, zjistíte, že pokud přidáte cursor.fetchall() v eclipse PyDev Výrazy ladicí okno před cursor.fetchall() je vyvolán, můžete vidět row_count hodnota je správná výsledná hodnota (1) v Výrazech sloupec hodnoty. Ale když budete pokračovat ve spouštění cursor.fetchall() funkce, vrácený výsledek je prázdný seznam.
A počet řádků vrácený parametrem row_count = cursor.execute(sql) kód také není číslo počtu záznamů, jehož uživatelské_jméno je „jerry“. Je to pouze počet vrácených řádků provedení, pokud existují dva nebo více záznamů, jejichž uživatelské_jméno je „jerry“, row_count = cursor.execute(sql) je stále 1.
Po nějakém zkoumání jsem zjistil, že tento problém existuje v níže uvedených scénářích.
- Existovat pouze tehdy, když odladím výše uvedený kód, když spustím výše uvedený kód přímo, výsledek je správný.
- Chybí pochopení
cursor.fetchall()Funkce se po vyvolání přesune na poslední řádek. A výsledek se uloží do řádku dočasné proměnné. - Toto je chyba PyMySQL nebo MySQL, jak je uvedeno v tématu StackOverflow.
Pokud jste našli nějaké další důvody, přidejte prosím své komentáře k tomuto článku, díky moc.