Biblioteca PyMySQL para conexão do Python ao MySQL ou MariaDB

A Biblioteca PyMySQL

A biblioteca PyMySQL é uma interface cliente MySQL escrita em Python puro, baseada na PEP 249 (Python Enhancement Proposals), que permite realizar conexão e interação com bancos de dados MySQL e MariaDB.

O PyMySQL implementa o Python Database API 2.0, que é e API que especifica o acesso a bancos de dados usando a linguagem Python, e informações gerais ou mais detalhadas sobre o projeto podem ser obtidas na página do repositório PyPi do projeto, incluindo links para a documentação oficial e github.

Como instalar o PyMySQL

Para realizar a instalação do PyMySQL, abra um terminal ou prompt de comandos em seu sistema e simplesmente execute o comando a seguir:

$ pip3 install PyMySQL

ou ainda

$ python3 -m pip install PyMySQL

Requisitos

Note que para utilizar o PyMySQL é necessário satisfazer aos seguintes requisitos:

  • Versão do Python: >= 3.6
  • Versão do MySQL Server: >= 5.6
  • Versão do MariaDB: >= 10.0

Conexão do PyMySQL a um banco de dados

Para efetuar a conexão ao banco MySQL ou MariaDB devemos inicialmente criar um objeto de conexão, invocando o método .connect() do PyMySQL, como segue:

import pymysql
con = pymysql.connect(host='servidor',user='usuário',password='senha',database='nome_banco',cursorclass=pymysql.cursors.DictCursor)

Os parâmetros a serem informados são:

  • host: Nome do host (servidor) do SGBD
  • user: Usuário que irá conectar ao banco
  • password: Senha da conexão
  • database: Nome o banco que será utilizado

Parâmetros opcionais:

  • charset: Conjunto de caracteres a utilizar, como por exemplo utf8mb4. O padrão é utf8.
  • cursorclass: Classe do cursor que será gerado. O padrão retorna os dados das consultas em tuplas. Uma alternativa é retornar na forma de um dicionário, usando o parâmetro pymysql.cursors.DictCursor (o qual usaremos em nossos exemplos).

Efetuar uma consulta ao BD

Um objeto cursor é usado para interação com o banco de dados.

O cursor padrão retorna os dados em uma tupla de tuplas. Quando usamos um cursor de dicionário, os dados são enviados na forma de dicionários Python. Dessa forma, podemos nos referir aos dados por seus nomes de coluna. Para tal, adicionamos o parâmetro cursorclass=pymysql.cursors.DictCursor ao método .connect() quando criamos o objeto de conexão.

A seguir temos o código comentado usado na conexão a um banco MySQL de nome “db_meuslivros” e na realização de duas consultas simples para teste, usando o método .cursor(), em tabelas de nomes “tbl_livros” e “tbl_editoras”.

import pymysql

# Abrir uma conexão a um banco de dados
con = pymysql.connect(host='localhost',user='root',database='db_MeusLivros',cursorclass=pymysql.cursors.DictCursor,password='123')

# Preparar um cursor com o método .cursor()
with con.cursor() as c:
    # Criar a consulta e executá-la no banco
    sql = "SELECT NomeLivro, ISBN13 FROM tbl_livros WHERE IdLivro = 104"
    c.execute(sql)
    res = c.fetchone() # Método fetchone(): retorna uma linha da tabela
    print(res)
    # Acessar o dado retornado pelo nome da coluna
    print('\nLivro retornado:', res['NomeLivro'])
    print()

    # Outra consulta (ainda usando o mesmo cursor): Retornar todas as linhas da tabela de editoras
    sql = "SELECT NomeEditora FROM tbl_editoras"
    c.execute(sql)

    # Método fetchall(): retorna todas as linhas obtidas pela consulta na tabela
    res = c.fetchall()
    print(res)
    print()

# Mostrar os dados retornados, um por linha, iterando sobre o resultado:
for linha in res:
    print(f"Editora: {linha['NomeEditora']}")

# Desconectar do servidor
con.close()

Note que não é necessário fechar o cursor, pois ele é fechado automaticamente ao finalizar a consulta.

Caso seja retornado o erro “TypeError: ‘NoneType’ object is not subscriptable” é provável que nenhum dados tenha sido retornado pela consulta – por exemplo, a tabela pode estar vazia ou o filtro aplicado não tem dados para retornar.

Já um erro “InterfaceError: (0, ”)” significa que a conexão está provavelmente fechada.

No próximo tutorial veremos como inserir registros em uma tabela do banco de dados MySQL (cadastrar dados).

Extra: Segurança de Senhas

Você deve ter notado que a senha de acesso ao banco de dados fica armazenada no próprio script, em texto plano. Assim qualquer um que consiga ter acesso ao código do script terá acesso ao banco de dados e, possivelmente, a outros bancos no servidor MySQL que usem a mesma senha. Obviamente, isso é um erro crasso de segurança.

Uma solução seria o emprego do módulo getpass, que permite solicitar ao usuário que entre com a senha de acesso no terminal, sem mostrar a senha enquanto é digitada, e sem a necessidade de gravá-la no próprio script.

Para usar esse módulo você deve importá-lo e então alterar o código do objeto de conexão como segue:

import pymysql
import getpass
senha = getpass.getpass('Digite a senha para conexão com o banco de dados:')
con = pymysql.connect(host='localhost', user='root', database='db_meuslivros',password=senha, cursorclass=pymysql.cursors.DictCursor)

O resto do código continua igual. Assim, ao executar o script, será solicitada a senha de acesso ao usuário no terminal, e o usuário deverá digitá-la para ter acesso ao banco de dados (a senha não aparece no terminal enquanto é digitada).

Se você estiver usando o IDE PyCharm, deverá realizar a seguinte configuração para que o módulo getpass funcione: clique em Run -> Edit Configurations… e então marque a caixa “Emulate terinal in output console“, na seção Execution.

Referências

 

Sobre Fábio dos Reis (1192 Artigos)
Fábio dos Reis trabalha com tecnologias variadas há mais de 30 anos, tendo atuado nos campos de Eletrônica, Telecomunicações, Programação de Computadores e Redes de Dados. É um entusiasta de Ciência e Tecnologia em geral, adora Viagens e Música, e estuda idiomas, além de ministrar cursos e palestras sobre diversas tecnologias em São Paulo e outras cidades do Brasil.
Contato: Website

1 Comentário em Biblioteca PyMySQL para conexão do Python ao MySQL ou MariaDB

  1. Sérgio Rossetto // 30/03/2022 em 17:08 // Responder

    Boa tarde …
    Estou estudando programação em Python, instalei MySQL, Python e Workbench fiz as conexões todas e já criei script para inserção e localização que estavam funcionando, agora estou estudando a alteração, porém, começou a dar um erro quando lê a linha “import mysql.connector” com a mensagem “ModuleNotFoundError: No module named ‘mysql'” e tudo que lei para tentar reparar não funciona segue dando o mesmo erro como que tivesse perdido path ou coisa parecida.
    Poderia me ajudar, por favor?

Escreva um comentário

Seu e-mail não será divulgado


*