sql >> Base de Datos >  >> RDS >> Mysql

Pymysql Cursor.fetchall() / Fetchone() no devuelve ninguno

PyMySQL es una biblioteca de Python que puede conectarse a la base de datos MySQL. Pero en estos días, cuando ejecuto el comando select SQL a través de PyMySQL, descubrí que la ejecución no devuelve ningún registro de la tabla de la base de datos, pero los datos realmente existen en la tabla de la base de datos. Y cuando ejecuto el comando SQL en la base de datos directamente, el SQL puede ejecutarse correctamente y los datos de la tabla se pueden devolver correctamente. A continuación se muestra la razón que encontré en mi caso.

1. Seleccione Propósito del comando SQL.

El objetivo del siguiente comando SQL es devolver el número de conteo de registros existentes cuyo nombre de usuario es 'jerry', si el número de conteo es mayor que 0, eso significa que el registro con la condición existe en la tabla de la base de datos, entonces el código no se insertará un nuevo registro en la tabla de la base de datos MySQL. Pero si el número de conteo devuelto es 0, eso significa que los datos no existen en la tabla, entonces podemos insertarlos en la tabla de la base de datos MySQL.

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

2. Cómo ejecutar por encima de SQL Use PyMySQL.

2.1 Instalar la biblioteca PyMySQL.

Si desea ejecutar el SQL anterior, use PyMySQL, luego primero debe instalar la biblioteca PyMySQL como se muestra a continuación.

:~$ 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 Ejecutar SQL Usar PyMySQL.

Ahora importe el módulo PyMySQL conectar , cursores class en su código Python y ejecute el comando SQL de selección anterior con él. Puede ver el código fuente a continuación.

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

Cuando ejecute el código fuente de Python anterior, obtendrá Ninguno del resultado de la ejecución. Cuando depuras el código fuente, puedes encontrarlo si agregas cursor.fetchall() en el eclipse PyDev Expresiones ventana de depuración antes de cursor.fetchall() se invoca, puede ver el row_count valor es el valor de resultado correcto (1) en las Expresiones columna de valor Pero cuando continúa ejecutando cursor.fetchall() función, el resultado devuelto es una lista vacía.

Y el recuento de filas devuelto por row_count = cursor.execute(sql) El código tampoco es el número de conteo de registros cuyo nombre de usuario es 'jerry'. Es solo el recuento de filas devuelto por la ejecución, si hay dos o más registros cuyo nombre de usuario es 'jerry', el row_count = cursor.execute(sql) sigue siendo 1.

Después de investigar un poco, encontré que este problema existe en los siguientes escenarios.

  1. Existe solo cuando depuro el código anterior, cuando ejecuto el código anterior directamente, el resultado es correcto.
  2. Falta comprensión de cursor.fetchall() función, la función se moverá a la última fila después de ser invocada. Y el resultado se guardará en la fila de la variable temporal.
  3. Este es un error de PyMySQL o MySQL, como se menciona en el tema StackOverflow.

Si ha encontrado otras razones, agregue sus comentarios a este artículo, muchas gracias.