Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Cursor.fetchall() / Fetchone() do Pymysql não retorna nenhum


PyMySQL é uma biblioteca python que pode se conectar ao banco de dados MySQL. Mas hoje em dia quando executo o comando select SQL através do PyMySQL, descobri que a execução não retorna nenhum registro da tabela do banco de dados, mas os dados realmente existem na tabela do banco de dados. E quando executo o comando SQL diretamente no banco de dados, o SQL pode ser executado com sucesso e os dados da tabela podem ser retornados corretamente. Abaixo está o motivo que encontrei no meu caso.


1. Selecione a finalidade do comando SQL.


O objetivo do comando SQL abaixo é retornar o número de contagem de registros existentes cujo nome_do_usuário é 'jerry', se o número de contagem for maior que 0 significa que o registro com a condição existe na tabela do banco de dados, então o código não irá inserir um novo registro na tabela do banco de dados MySQL. Mas se o número de contagem retornado for 0, isso significa que os dados não existem na tabela, então podemos inseri-los na tabela do banco de dados MySQL.
"select count(id) as count from dev2qa_example.user_account where lower(user_name) = 'jerry'"

2. Como executar acima do SQL Use PyMySQL.

2.1 Instale a biblioteca PyMySQL.


Se você deseja executar o SQL acima, use o PyMySQL, então você precisa instalar a biblioteca PyMySQL primeiro, como abaixo.
:~$ 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 Executar SQL Use PyMySQL.


Agora importe o módulo PyMySQL conectar , cursores class em seu código Python e execute o comando SQL select acima com ele. Você pode ver o código-fonte abaixo.
# 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()

Ao executar o código-fonte python acima, você obterá Nenhum do resultado da execução. Ao depurar o código-fonte, você pode descobrir que se adicionar cursor.fetchall() no eclipse PyDev Expressões janela de depuração antes de cursor.fetchall() é invocado, você pode ver o row_count value é o valor de resultado correto (1) nas Expressões coluna de valor. Mas quando você continua a executar o cursor.fetchall() função, o resultado retornado é uma lista vazia.

E a contagem de linhas retornada por row_count = cursor.execute(sql) code também não é o número de contagem de registros cujo nome_do_usuário é 'jerry'. É apenas a contagem de linhas retornada pela execução, se houver dois ou mais registros cujo nome de usuário seja 'jerry' o row_count = cursor.execute(sql) ainda é 1.

Após alguma investigação, descobri que esse problema existe nos cenários abaixo.
  1. Existem apenas quando depuro o código acima, quando executo o código acima diretamente, o resultado está correto.
  2. Falha na compreensão de cursor.fetchall() função, a função irá para a última linha após ser invocada. E o resultado será salvo na linha da variável temporária.
  3. Este é um bug do PyMySQL ou MySQL, como o tópico StackOverflow se refere.

Se você encontrou outras razões, por favor, adicione seus comentários a este artigo, muito obrigado.