sql >> Databáze >  >> RDS >> Mysql

Pymysql Cursor.fetchall() / Fetchone() Vrátí žádné

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
[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 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.

  1. 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ý.
  2. 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é.
  3. 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.


  1. Auditování PostgreSQL pomocí pgAudit

  2. Naučte se importovat data aplikace Excel do databáze MySQL

  3. 4 důvody, proč byste měli ve svém plánování na rok 2020 upřednostňovat monitorování databáze

  4. Jak zakázat všechny spouštěče v databázi SQL Server