Bóson Treinamentos em Ciência e Tecnologia

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

Conexão a banco de dados MySQL com Python e biblioteca PyMySQL

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:

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:

Parâmetros opcionais:

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

 

Sair da versão mobile