sql >> Databasteknik >  >> RDS >> Mysql

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

PyMySQL är ett pythonbibliotek som kan ansluta till MySQL-databasen. Men nu för tiden när jag kör kommandot select SQL via PyMySQL, fann jag att körningen inte returnerar några poster från databastabellen, men data finns verkligen i databastabellen. Och när jag kör SQL-kommandot i databasen direkt, kan SQL köras framgångsrikt och tabelldata kan returneras korrekt. Nedan är anledningen jag hittade i mitt fall.

1. Välj SQL Command Purpose.

Målet med SQL-kommandot nedan är att returnera antalet befintliga poster vars användarnamn är 'jerry', om antalet är större än 0 betyder det att posten med villkoret finns i databastabellen, kommer koden inte att infogas en ny post i MySQL-databastabellen. Men om det returnerade antalet är 0 betyder det att data inte finns i tabellen, då kan vi infoga den i MySQL-databastabellen.

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

2. Hur man kör över SQL Använd PyMySQL.

2.1 Installera PyMySQL Library.

Om du vill köra ovanstående SQL använder du PyMySQL, då måste du först installera PyMySQL-biblioteket som nedan.

:~$ 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 Använd PyMySQL.

Importera nu PyMySQL-modulen anslut , markörer klass i din Python-kod och kör ovanstående select SQL-kommando med den. Du kan se källkoden nedan.

# 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ör ovanstående python-källkod får du Ingen från exekveringsresultatet. När du felsöker källkoden kan du upptäcka att om du lägger till cursor.fetchall() i eclipse PyDev Expressions felsökningsfönster före cursor.fetchall() anropas kan du se row_count värde är det korrekta resultatvärdet (1) i Uttryck värdekolumn. Men när du fortsätter att köra cursor.fetchall() funktion, det returnerade resultatet är en tom lista.

Och radantalet returneras av row_count = cursor.execute(sql) koden är inte heller postens antal vars användarnamn är "jerry". Det är bara det antal rader som returneras av exekveringen, om det finns två eller flera poster vars användarnamn är 'jerry' är row_count = cursor.execute(sql) är fortfarande 1.

Efter lite undersökning upptäckte jag att det här problemet finns i scenarierna nedan.

  1. Finns bara när jag felsöker ovanstående kod, när jag kör ovanstående kod direkt blir resultatet korrekt.
  2. Miss förståelse för cursor.fetchall() funktion kommer funktionen att flyttas till sista raden efter att ha anropats. Och resultatet kommer att sparas i den temporära variabelraden.
  3. Detta är en bugg av PyMySQL eller MySQL, som StackOverflow-ämnet hänvisade till.

Om du har hittat några andra skäl, lägg gärna till dina kommentarer till den här artikeln, tack så mycket.


  1. använd en variabel för tabellnamn i mysql sproc

  2. Hur FIND_IN_SET() fungerar i MariaDB

  3. Varför skapar inte postgres databasen?

  4. SQL-serverfråga för att få listan över kolumner i en tabell tillsammans med datatyper, NOT NULL och PRIMÄRNYCKEL-begränsningar