Python Iluminado

MySQL

Introdução

Assim como muitas outras linguagens de programação, Python também nos possibilita trabalharmos com banco de dados.

Existem diversos sistemas gerenciadores de banco de dados disponíveis, nesse guia específico trabalharemos com o MySQL, que é um dos mais populares e usados no mercado.

O MySQL é um software gratuito e de código aberto sob os termos da GNU General Public License e também está disponível sob uma variedade de licenças proprietárias.

Para seguir conosco, você precisa baixar o MySQL, que está disponível de forma gratuita em seu site oficial: https://www.mysql.com/downloads/

Faça a instalação, defina seu usuário e senha e vamos ao código!

MySQL Driver

Para que possamos nos conectar com o MySQL através do Python, é necessário que instalemos o driver de conexão, para isso vamos utilizar o PIP.

Abra então sua interface de linha de comando e digite o comando:

pip install mysql-connector

Aguarde o download e o driver estará pronto para utilizarmos. Agora vamos confirmar se ele foi instalado corretamente:

import mysql.connector

Caso o comando acima tenha sido executado sem nenhum erro, estamos prontos para continuar!

O primeiro passo agora é criar uma conexão com o banco de dados, para isso utilizaremos o nosso nome de usuário e senha do banco de dados MySQL. Lembre que você escolheu ambos durante o processo de instalação do banco de dados em sua máquina.

import mysql.connector
db = mysql.connector.connect(
host="localhost",
user="usuario",
passwd="senha"
)
print(db)
# <mysql.connector.connection.MySQLConnection object at 0x7f66da2a7550>

Especificamos a conexão com o localhost (nossa própria máquina) e nosso usuário e senha, veja que ele nos retorna um objeto de conexão, agora estamos prontos para manipular o banco de dados utilizando comandos SQL.

Criando um Banco de Dados

Agora vamos criar um banco de dados chamado banco, para isso vamos utilizar o comando SQL "CREATE DATABASE". Perceba que estamos definindo um cursor que nos permite executar comandos SQL.

import mysql.connector
db = mysql.connector.connect(
host="localhost",
user="usuario",
passwd="senha"
)
cursor = db.cursor()
cursor.execute("CREATE DATABASE banco")

Caso nenhum erro tenha ocorrido, signifca que criamos nosso primeiro banco de dados com sucesso.

Agora vamos checar se o banco de dados que criamos realmente está presente, para isso utilizaremos o comando "SHOW DATABASES", este que vai mostrar todos os bancos presentes no nosso sistema.

import mysql.connector
db = mysql.connector.connect(
host="localhost",
user="usuario",
passwd="senha"
)
cursor = db.cursor()
cursor.execute("SHOW DATABASES")
for c in cursor:
print(c)
# ('information_schema',)
# ('banco',)
# ('mysql',)
# ('performance_schema',)
# ('sys',)
# ('wordpress',)

Podemos também acessar o banco de dados no momento da conexão:

import mysql.connector
db = mysql.connector.connect(
host="localhost",
user="usuario",
passwd="senha",
database="banco"
)

Caso o banco de dados não existe, receberemos uma mensagem de erro.

Criando uma Tabela

Para que possamos criar tabelas no nosso banco de dados, devemos utilizar o comando "CREATE TABLE", precisamos lembrar dessa vez de definir o nome do banco de dados que vamos usar durante a conexão.

import mysql.connector
db = mysql.connector.connect(
host="localhost",
user="usuario",
passwd="senha",
database="banco"
)
cursor = db.cursor()
cursor.execute("CREATE TABLE filmes (nome VARCHAR(255), gênero VARCHAR(255))")
cursor.execute("SHOW TABLES")
for c in cursor:
print(c)
# ('filmes',)

Caso o comando execute sem erros, significa que nossa tabela está criada. Em seguida mostramos as tabelas do nosso banco de dados com o comando "SHOW TABLES", veja que ele nos retorna nossa tabela filmes.

Chave primária

Ao criarmos uma tabela, é importante que tenhamos uma coluna que possua uma chave única para cada registro, esta chave se chama chave primária, para isso vamos utilizar o comando "INT AUTO_INCREMENT PRIMARY KEY" que irá inserir um número único para cada registro, começando por 1 e incrementando para cada registro que vier.

cursor.execute("CREATE TABLE filmes (id INT AUTO_INCREMENT PRIMARY KEY, nome VARCHAR(255), endereco VARCHAR(255))")

Veja que ocorre um problema, pois já possuímos a tabela no nosso banco, para contornarmos essa situação, vamos utilizar o comando "ALTER TABLE", que irá alterar a tabela com essa nova coluna.

cursor.execute("ALTER TABLE filmes ADD COLUMN id INT AUTO_INCREMENT PRIMARY KEY")

Inserindo Dados na Tabela

De nada adianta termos uma tabela se não for para preenchermos com valores para uso futuro, não é mesmo? Para essa tarefa vamos utilizar o comando "INSERT INTO".

import mysql.connector
db = mysql.connector.connect(
host="localhost",
user="usuario",
passwd="senha",
database="banco"
)
cursor = db.cursor()
comando_sql = "INSERT INTO filmes (nome, gênero) VALUES (%s, %s)"
dados = ("2001: A Space Odyssey", "Science Fiction")
cursor.execute(comando_sql, dados)
db.commit()
print(cursor.rowcount, "registro inserido") # 1 registro inserido

Veja que foi necessário utilizarmos o comando db.commit(), que é necessário para confirmarmos as mudanças no nosso banco.

Inserindo Múltiplas Linhas

Para que possamos inserir múltiplas linhas de uma só vez, podemos executar o método executemany(), o segundo parâmetro desse método é uma lista de tuplas que contém os dados que vamos inserir.

import mysql.connector
db = mysql.connector.connect(
host="localhost",
user="usuario",
passwd="senha",
database="banco"
)
cursor = db.cursor()
comando_sql = "INSERT INTO filmes (nome, gênero) VALUES (%s, %s)"
valores = [
("The Lord of the Rings: The Fellowship of the Ring", "Fantasy"),
("Star Wars: Episode V – The Empire Strikes Back", "Space Opera"),
("Andrei Rublev", "Drama")
]
cursor.executemany(comando_sql, valores)
db.commit()
print(cursor.rowcount, "filmes foram inseridos") # 3 filmes foram inseridos

Podemos obter o id da linha que acabamos de inserir perguntando ao objeto cursor:

print("1 registro inserido, ID:", cursor.lastrowid) # 1 registro inserido, ID: 2

Selecionando Dados da Tabela

Para que possamos selecionar os valores que inserimos, utilizamos o comando "SELECT".

import mysql.connector
db = mysql.connector.connect(
host="localhost",
user="usuario",
passwd="senha",
database="banco"
)
cursor = db.cursor()
cursor.execute("SELECT * FROM filmes")
resultados = cursor.fetchall()
for resultado in resultados:
print(resultado)
# ('2001: A Space Odyssey', 'Science Fiction', 1)
# ('The Lord of the Rings: The Fellowship of the Ring', 'Fantasy', 2)
# ('Star Wars: Episode V – The Empire Strikes Back', 'Space Opera', 3)
# ('Andrei Rublev', 'Drama', 4)

O * em SELECT específica que queremos todos os registros da tabela, observe que usamos o método fetchall() que trará todas as linhas do nosso último comando executado.

Também podemos selecionar apenas determinadas colunas de nossa tabela, por exemplo:

cursor.execute("SELECT nome, gênero FROM usuario")
cursor.execute("SELECT nome FROM usuario")

O método fetchone() nos traz apenas uma linha da tabela, ele nos retornará apenas a primeira do resultado:

import mysql.connector
db = mysql.connector.connect(
host="localhost",
user="usuario",
passwd="senha",
database="banco"
)
cursor = db.cursor()
cursor.execute("SELECT nome FROM filmes")
resultado = cursor.fetchone()
print(resultado) # ('2001: A Space Odyssey',)

Selecionando com Filtros

É possível usarmos filtros para selecionar apenas entradas específicas de nossas tabelas, para isso, contamos com a ajuda do comando "WHERE".

import mysql.connector
db = mysql.connector.connect(
host="localhost",
user="usuario",
passwd="senha",
database="banco"
)
cursor = db.cursor()
cursor.execute("SELECT * FROM filmes WHERE nome = 'Andrei Rublev'")
resultados = cursor.fetchall()
for resultado in resultados:
print(resultado)
# ('Andrei Rublev', 'Drama', 4)

Também podemos usar Caracteres Wildcard para selecionar os registros que começam, incluem ou terminam com uma determinada letra ou frase.

Usamos o % para representar caracteres wildcard.

Também estamos usando a palavra-chave LIKE, para indicar que queremos um registro contendo tal valor:

import mysql.connector
db = mysql.connector.connect(
host="localhost",
user="usuario",
passwd="senha",
database="banco"
)
cursor = db.cursor()
cursor.execute("SELECT * FROM filmes WHERE nome LIKE '%The%'")
resultados = cursor.fetchall()
for resultado in resultados:
print(resultado)
# ('The Lord of the Rings: The Fellowship of the Ring', 'Fantasy', 2)
# ('Star Wars: Episode V – The Empire Strikes Back', 'Space Opera', 3)

Evitando SQL Injection

Quando os valores da consulta são fornecidos pelo usuário, devemos escapar dos valores. Isso evita injeções de SQL, que é uma técnica comum de hacking para destruir ou usar indevidamente nosso banco de dados.

O módulo mysql.connector possui métodos para escapar dos valores da consulta:

import mysql.connector
db = mysql.connector.connect(
host="localhost",
user="usuario",
passwd="senha",
database="banco"
)
cursor = db.cursor()
sql = "SELECT * from filmes WHERE nome = %s"
filme = ("The Lord of the Rings: The Fellowship of the Ring",)
cursor.execute(sql,filme)
resultado = cursor.fetchall()
print(resultado)
# [('The Lord of the Rings: The Fellowship of the Ring', 'Fantasy', 2)]

Ordenando os Resultados

O comando "ORDER BY" pode ser usado para ordernarmos o resultado em ordem ascendente ou descendente.

Por padrão, ORDER BY irá ordernar em ordem ascendente, para ordernarmos na ordem descendente, devemos usar a palavra-chave DESC.

import mysql.connector
db = mysql.connector.connect(
host="localhost",
user="usuario",
passwd="senha",
database="banco"
)
cursor = db.cursor()
sql = "SELECT * from filmes ORDER BY nome"
cursor.execute(sql)
resultados = cursor.fetchall()
for resultado in resultados:
print(resultado)
# ('2001: A Space Odyssey', 'Science Fiction', 1)
# ('Andrei Rublev', 'Drama', 4)
# ('Star Wars: Episode V – The Empire Strikes Back', 'Space Opera', 3)
# ('The Lord of the Rings: The Fellowship of the Ring', 'Fantasy', 2)

E agora, de forma descendente:

import mysql.connector
db = mysql.connector.connect(
host="localhost",
user="usuario",
passwd="senha",
database="banco"
)
cursor = db.cursor()
sql = "SELECT * from filmes ORDER BY nome DESC"
cursor.execute(sql)
resultados = cursor.fetchall()
for resultado in resultados:
print(resultado)
# ('The Lord of the Rings: The Fellowship of the Ring', 'Fantasy', 2)
# ('Star Wars: Episode V – The Empire Strikes Back', 'Space Opera', 3)
# ('Andrei Rublev', 'Drama', 4)
# ('2001: A Space Odyssey', 'Science Fiction', 1)

Deletando Registros

Podemos também deletar registros da nossa tabela, para isso vamos usar o comando "DELETE FROM".

import mysql.connector
db = mysql.connector.connect(
host="localhost",
user="usuario",
passwd="senha",
database="banco"
)
cursor = db.cursor()
sql = "DELETE FROM filmes WHERE nome = 'Andrei Rublev'"
cursor.execute(sql)
db.commit()
print(cursor.rowcount, "registro excluído") # 1 registro excluído

Importante: Perceba que utilizamos a claúsula WHERE no nosso comando, fazendo com que possamos especificar o registro a ser excluído, porém, se você deixar de usar ela, todos os registros serão deletados, então tenha muita atenção!

Observe também que usamos o método db.commit(), ele é necessário para que as mudanças sejam concretizadas, sem ele nenhuma mudança irá ocorrer na tabela.

Deletando uma Tabela

Podemos facilmente deletar uma tabela com o comando "DROP TABLE":

import mysql.connector
db = mysql.connector.connect(
host="localhost",
user="usuario",
passwd="senha",
database="banco"
)
cursor = db.cursor()
sql = "DROP TABLE filme"
cursor.execute(sql)

Se a tabela que você deseja excluir já foi excluída ou, por qualquer outro motivo, não existe, você pode usar a palavra-chave IF EXISTS para evitar um erro.

import mysql.connector
db = mysql.connector.connect(
host="localhost",
user="usuario",
passwd="senha",
database="banco"
)
cursor = db.cursor()
sql = "DROP TABLE IF EXISTS filme"
cursor.execute(sql)

Atualizando a Tabela

Caso queiramos atualizar nossa tabela, podemos utilizar o comando "UPDATE", nesse exemplo vamos alterar o gênero do filme 2001: A Space Odyssey para Ciência.

import mysql.connector
db = mysql.connector.connect(
host="localhost",
user="usuario",
passwd="senha",
database="banco"
)
cursor = db.cursor()
comando_sql = "UPDATE filmes SET gênero = 'Ciência' WHERE nome = '2001: A Space Odyssey'"
cursor.execute(comando_sql)
db.commit()
print(cursor.rowcount, "registro afetado") # 1 registro afetado

Observe a cláusula WHERE na sintaxe UPDATE: A cláusula WHERE especifica qual registro ou registros devem ser atualizados. Se omitirmos a cláusula WHERE, todos os registros serão atualizados!

Limitando o Resultado

Podemos limitar o número de registros retornados de nossa consulta usando o comando LIMIT:

import mysql.connector
db = mysql.connector.connect(
host="localhost",
user="usuario",
passwd="senha",
database="banco"
)
cursor = db.cursor()
cursor.execute("SELECT * from filmes LIMIT 2")
resultados = cursor.fetchall()
for resultado in resultados:
print(resultado)
# ('2001: A Space Odyssey', 'Ciência', 1)
# ('The Lord of the Rings: The Fellowship of the Ring', 'Fantasy', 2)

Esta foi uma pequena introdução ao Python em conjunto com MySQL, veja que as possibilidades são grandes e existe muito mais pela frente, apenas demonstramos alguns comandos SQL, porém existem diversos, há toda uma literatura voltada para bancos de dados relacionais, nesse caso trabalhamos com apenas uma tabela, mas podemos ter diversas tabelas e relacionar umas com as outras.

Banco de dados é uma área vasta e que exige muito estudo, eles estão presentes em grandes corporações e guardam quantidades inimagináveis de informação, com certeza um grande tópico para ser estudado!