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
- Documentação Oficial: https://pymysql.readthedocs.io/en/latest/index.html
- Github do projeto: https://github.com/PyMySQL/PyMySQL
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?