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.
- Existem apenas quando depuro o código acima, quando executo o código acima diretamente, o resultado está correto.
- 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. - 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.