sql >> Database >  >> RDS >> Mysql

Pymysql Cursor.fetchall() / Fetchone() Retourneert Geen

PyMySQL is een python-bibliotheek die verbinding kan maken met de MySQL-database. Maar tegenwoordig, toen ik het select SQL-commando uitvoerde via PyMySQL, merkte ik dat de uitvoering geen records uit de databasetabel retourneerde, maar de gegevens bestaan ​​echt in de databasetabel. En wanneer ik de SQL-opdracht rechtstreeks in de database uitvoer, kan de SQL met succes worden uitgevoerd en kunnen de tabelgegevens correct worden geretourneerd. Hieronder staat de reden die ik in mijn geval heb gevonden.

1. Selecteer het doel van de SQL-opdracht.

Het doel van de onderstaande SQL-opdracht is om het aantal bestaande records te retourneren waarvan de gebruikersnaam 'jerry' is. Als het aantal groter is dan 0, betekent dit dat het record met de voorwaarde in de databasetabel bestaat, dan wordt de code niet ingevoegd een nieuw record in de MySQL-databasetabel. Maar als het geretourneerde telnummer 0 is, betekent dit dat de gegevens niet in de tabel voorkomen, dan kunnen we deze in de MySQL-databasetabel invoegen.

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

2. Hoe boven SQL uit te voeren Gebruik PyMySQL.

2.1 PyMySQL-bibliotheek installeren.

Als u de bovenstaande SQL wilt uitvoeren, gebruik dan PyMySQL, dan moet u eerst de PyMySQL-bibliotheek installeren zoals hieronder.

:~$ 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 SQL uitvoeren Gebruik PyMySQL.

Importeer nu de PyMySQL-module connect , cursors class in uw Python-code en voer de bovenstaande select SQL-opdracht ermee uit. Je kunt de onderstaande broncode zien.

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

Wanneer u de bovenstaande python-broncode uitvoert, krijgt u Geen van het uitvoeringsresultaat. Wanneer u de broncode debugt, kunt u zien dat als u cursor.fetchall() toevoegt in de eclips PyDev Expressies foutopsporingsvenster vóór cursor.fetchall() wordt aangeroepen, kunt u de row_count . zien waarde is de juiste resultaatwaarde (1) in de Uitdrukkingen waarde kolom. Maar wanneer u doorgaat met het uitvoeren van de cursor.fetchall() functie, is het geretourneerde resultaat een lege lijst.

En het aantal rijen geretourneerd door row_count = cursor.execute(sql) code is ook niet het aantal records waarvan de gebruikersnaam 'jerry' is. Het is alleen de uitvoering die het aantal rijen retourneert, als er twee of meer records zijn waarvan de gebruikersnaam 'jerry' is, is de row_count = cursor.execute(sql) is nog steeds 1.

Na wat onderzoek ontdekte ik dat dit probleem zich voordoet in de onderstaande scenario's.

  1. Bestaat alleen als ik de bovenstaande code debug, als ik de bovenstaande code rechtstreeks uitvoer, is het resultaat correct.
  2. Onjuist begrip van cursor.fetchall() functie, zal de functie naar de laatste rij worden verplaatst nadat deze is aangeroepen. En het resultaat wordt opgeslagen in de rij met tijdelijke variabelen.
  3. Dit is een bug van PyMySQL of MySQL, zoals het StackOverflow-onderwerp waarnaar wordt verwezen.

Als je andere redenen hebt gevonden, voeg dan je opmerkingen toe aan dit artikel, heel erg bedankt.


  1. Tabelrechten retourneren van een gekoppelde server in SQL Server (T-SQL-voorbeelden)

  2. Hoe een onbeperkt aantal tekens opslaan in Oracle 11g?

  3. gebruik de opdracht database_name in PostgreSQL

  4. Wijzig SQL Database verdachte modus in normale modus met query