Usando SQL com Python
Como usar SQL dentro do Python usando o SQLite3
Conteúdo
- Por que e quando você deveria usar um banco de dados no Python
- Diferentes tipos de bancos de dados e seus usos
- SQLite3
- Usando o SQLite3 com o Python
- Criando uma tabela
- Inserindo dados
- Acessando dados
- Acessando dados com parâmetros
- Atualizando dados
- Apagando dados
- Criando uma aplicação simples com o SQLite3
Por que e quando você deveria usar um banco de dados no Python
É bem simples, se você quer que a sua aplicação salve dados entre diferentes seções. Por exemplo, se a sua aplicação pede o nome da pessoa que está usando e você quer que não seja preciso perguntar da próxima vez que abrir, você precisa de uma maneira de salvar essa informação. É claro, neste caso simples é possível salvar isso em um arquivo de texto, mas caso seja preciso salvar várias informações diferentes, como nome, idade, quanto você comeu ontem na janta e mais, um banco de dados permite fazer isso de maneira rápida e organizada.
Diferentes tipos de bancos de dados e seus usos
Como já deve saber, existem dezenas, talvez centenas, de diferentes bancos de dados, vários deles usando a linguagem SQL para se lidar (o que facilita bastante), todos eles tem o mesmo propósito, salvar dados de maneira organizada e rápida de de acessar e alterar. É claro, cada banco de dado faz isso diferente e com escala diferente, por exemplo, se você for criar uma aplicação Web com a escala da Amazon, você provavelmente iria querer um banco de dados mais parrudo como o PostgreSQL ou um banco Oracle, mas se for fazer uma simples aplicação para um usuário final, onde só precisa salvar dados para uso local dele, um banco de dados leve como o SQLite3 ou DuckDB seria ideal.
SQLite3
Hoje iremos usar o SQLite3, tecnicamente o banco de dados mais usado no mundo, pois está disponível em todos os celulares e na grande maioria dos computadores do mundo. Ele é um banco de dados que salva seus dados em arquivos, ele é gratuito e open-source, muito fácil de usar e devido a sua simplicidade, absurdamente rápido. E tem ainda mais um grande benefício, ele está incluso dentro do Python, ou seja, você nem precisa o instalar em sua máquina se já tem o Python nela.
Usando o SQLite3 com o Python
Antes de mais nada, crie uma pasta para o projeto que iremos criar, algo como sqlite, para mantermos as coisas organizadas. Então crie um script python com o nome criar_tabela.py
.
Para usar o SQLite3 com o Python basta importar a classe Sqlite3:
import sqlite3
E então crie uma conexão com o banco de dados, isto é, fale aonde será criado o arquivo e se conecte com ele:
import sqlite3
conexao = sqlite3.connect("dados.db") # o nome do seu banco de dados pode ser qual você quiser, mas tem que ter a extensão .db
O comando connect()
do sqlite3 cria o arquivo do banco de dados caso não exista e retorna uma conexao á ele, que você deve salvar em uma variável para executar comandos com SQL depois.
Executando apenas esse código irá criar o arquivo dados.db
na pasta do seu projeto. E pronto, agora você pode começar a fazer operações no seu banco de dados SQLite3. Vamos ver como executar algumas das ações mais comuns de bancos de dados SQL com essa nossa conexão.
Criando uma tabela
Vamos modificar o código para criar uma tabela chamada usuarios
no nosso banco de dados:
import sqlite3
conexao = sqlite3.connect("dados.db")
conexao.execute("CREATE TABLE IF NOT EXISTS usuarios (id INTEGER PRIMARY KEY AUTOINCREMENT, nome TEXT NOT NULL, idade INTEGER NOT NULL)")
print("Tabela usuarios criada")
O comando execute()
da conexão te permite executar qualquer comando SQL que quiser no seu banco de dados, basta escrever como uma string
com ele dentro, também dá pra colocar parâmetros nela, veremos como depois.
E agora, se executar o script criar_tabela.py
, o python irá criar a tabela usuários que terá os campos id (número inteiro), nome (texto que não pode ser vazio) e idade (número inteiro que não pode ser vazio).
Inserindo dados
Agora vamos começar a inserir dados na tabela usuarios, para isso crie um novo script com o nome inserir_dados.py
. E dentro dele:
import sqlite3
conexao = sqlite3.connect("dados.db")
conexao.execute("INSERT INTO usuarios(nome, idade) VALUES('Jonathan Santos', 22)")
conexao.execute("INSERT INTO usuarios(nome, idade) VALUES('Renan Santos', 27)")
conexao.execute("INSERT INTO usuarios(nome, idade) VALUES('Murillo Santos', 19)")
conexao.commit()
print("Criado 3 usuários")
Nós executamos um comando SQL que criou 3 dados diferentes na tabela usuarios. Mas precisamos executar o comando conexao.commit()
que salva as alterações que fizemos no banco de dados. Se não executar esse comando, não importa os comandos SQL que fizer, nenhuma alteração será salva no banco, então sempre se lembre de o usar no final de qualquer operação que altere o seu banco de dados.
E agora, se executar o script inserir_dados.py
, o python irá popular a tabela usuarios com 3 registros. Agora vamos ver como podemos acessar esses dados.
Acessando dados
Agora vamos começar a acessar os dados na tabela usuarios, para isso crie um novo script com o nome acessar_dados.py
. E dentro dele:
import sqlite3
conexao = sqlite3.connect("dados.db")
cursor = conexao.cursor()
cursor.execute("SELECT * FROM usuarios")
resultados = cursor.fetchall()
print("Resultados:", resultados)
Vamos entender esses novos comandos:
cursor = conexao.cursor()
: Esse comando cria um cursor, um objeto que usamos para executar comandos SQL, mas que salva qualquer dado que retornar a partir desses comandos, sempre que usar umSELECT
, use um cursor (por exemplo, a criação da tabela e criação dos resultados não precisarem dele, pois não retornavam dados).cursor.execute()
: Esse comando execute um comando SQL usando o cursor, como queremos ter acesso aos dados que retornam doSELECT
, precisamos usar ocursor.execute()
ao invés doconexao.execute()
.cursor.fetchall()
: Esse comando retorna os resultados dos comandoscursor.execute()
anteriores para que possamos os usar diretamente ou os salvar em uma variavel, como fizemos nesse caso.
E finalmente, para mostrar os resultados, executamos um print(resultados)
. Se executar o script acessar_dados.py
, aparecerá na tela:
Resultados: [(1, 'Jonathan Santos', 22), (2, 'Renan Santos', 27), (3, 'Murillo Santos', 19)]
Caso tenhamos mais que 3 registros na tabela, ficará dificil de ver os resultados, então vamos modificar essa última linha, apague o comando print("Resultados:", resultados)
e o substitua pelo seguinte:
print("Resultados:")
for usuario in resultados:
print(usuario)
Agora aparecerá:
Resultados:
(1, 'Jonathan Santos', 22)
(2, 'Renan Santos', 27)
(3, 'Murillo Santos', 19)
Bem melhor. Mas e se você quiser filtrar os dados?
Acessando dados com parâmetros
Para filtrar dados, basta adicionar o WHERE
no comando SQL:
import sqlite3
conexao = sqlite3.connect("dados.db")
cursor = conexao.cursor()
cursor.execute("SELECT * FROM usuarios WHERE id=1")
resultado = cursor.fetchall()
print("Resultado:", resultado) # Mudei para esse método, pois só estamos pegando um resultado mesmo
E funciona, mas e se você quiser usar variáveis ou expressões como parâmetros dos seus comandos SQL? Nós então usamos o segundo parâmetro do comando cursor.execute()
:
import sqlite3
conexao = sqlite3.connect("dados.db")
cursor = conexao.cursor()
cursor.execute("SELECT * FROM usuarios WHERE id=?", [1]) # Mesma coisa que cursor.execute("SELECT * FROM usuarios WHERE id=1")
resultado = cursor.fetchall()
print("Resultado:", resultado)
Nós colocamos um ?
aonde o parâmetro deveria estar e então nós criamos uma lista (sim uma lista, você já vai entender o porque) com o valor que queremos dentro. Caso queira usar mais de um parâmetro no comando, adicione mais um ?
aonde deveria estar e mais um valor na lista:
import sqlite3
conexao = sqlite3.connect("dados.db")
cursor = conexao.cursor()
cursor.execute("SELECT * FROM usuarios WHERE nome=? AND idade<?", ["Murillo Santos", 25])
resultados = cursor.fetchall()
print("Resultados:", resultados)
E pronto, agora você sabe usar parâmetros. É possível os usar no comando conexao.execute()
, útil para usar na criação de novos dados. Agora vamos ver como atualizar dados.
Atualizando dados
Agora vamos começar a atualizar dados na tabela usuarios, para isso crie um novo script com o nome atualizar_dados.py
. E dentro dele:
import sqlite3
conexao = sqlite3.connect("dados.db")
conexao.execute("UPDATE usuarios SET nome='Alguma coisa'")
conexao.commit()
print('Atualizado todos os usuários com o nome "Alguma coisa"')
Comparado a criar os usuários, praticamente nada mudou, a única coisa diferente o comando. Se executar o script atualizar_dados.py
, o python irá atualizar todos os dados da tabela usuarios com o nome “Alguma coisa”, se executar o script acessar_dados.py
você verá o resultado.
Para usar com parâmetros:
import sqlite3
conexao = sqlite3.connect("dados.db")
conexao.execute("UPDATE usuarios SET idade=? WHERE id=?", [28, 2])
conexao.commit()
print('Atualizado a idade do usuário com id 2 para 28')
E agora apenas a idade do usuario com id 2 será atualizado. Agora vamos ver como apagar dados.
Apagando dados
Agora vamos apagar dados na tabela usuarios, para isso crie um novo script com o nome apagar_dados.py
. E dentro dele:
import sqlite3
conexao = sqlite3.connect("dados.db")
conexao.execute("DELETE FROM usuarios")
conexao.commit()
print('Apagado todos os usuários')
Bem simples, apenas o comando mudou, nada de mais. Agora, se executar o script apagar_dados.py
, o python irá apagar todos os dados da tabela usuarios, se executar o script acessar_dados.py
você verá o resultado.
Novamente, se quiser usar parâmetros:
import sqlite3
conexao = sqlite3.connect("dados.db")
conexao.execute("DELETE FROM usuarios WHERE id=?", [3])
conexao.commit()
print('Apagado usuário com id 3')
Agora se executar o script apagar_dados.py
, apenas o usuário com id 3 será apagado.
Criando uma aplicação simples com o SQLite3
Parabéns, agora você sabe usar o SQLite3 junto do Python, a partir daqui sua imaginação é o limite. Existem mais coisas que você pode fazer com o SQLite3 e Python, para saber basta acessar a documentação do SQLite3 no Python. Mas para demonstrar um exemplo de uma aplicação mais completa que usa o SQLite3 junto do Python e até para demonstrar o que é possível, Execute o seguinte em um script com o nome usuarios.py
:
import sqlite3
import os
conexao = sqlite3.connect("dados.db")
cursor = conexao.cursor()
opcao = ""
while opcao != 0:
os.system('cls') # Mude para clear caso esteja no linux ou no Mac
print("O que você quer fazer?")
print("1. Criar tabela usuarios")
print("2. Apagar tabela usuarios")
print("3. Criar dados na tabela usuarios")
print("4. Acessar dados da tabela usuarios")
print("5. Atualizar todos os nomes de dados na tabela usuarios para 'Alguma coisa'")
print("6. Apagar todos os dados na tabela usuarios")
print("Nenhum dos acima, fechar programa")
print("")
opcao = input("Digite o número da opção que você quer e aperte ENTER: ")
print("")
if opcao == "1":
conexao.execute("CREATE TABLE IF NOT EXISTS usuarios (id INTEGER PRIMARY KEY AUTOINCREMENT, nome TEXT NOT NULL, idade INTEGER NOT NULL)")
print("Criado tabela usuarios")
elif opcao == "2":
conexao.execute("DROP TABLE usuarios")
print("Apagado tabela usuarios")
elif opcao == "3":
conexao.execute("INSERT INTO usuarios(nome, idade) VALUES(?, ?)", ["Jonathan Santos", 22])
conexao.execute("INSERT INTO usuarios(nome, idade) VALUES(?, ?)", ["Renan Santos", 27])
conexao.execute("INSERT INTO usuarios(nome, idade) VALUES(?, ?)", ["Murillo Santos", 19])
conexao.commit()
print("Criado 3 dados na tabela usuarios")
elif opcao == "4":
cursor = conexao.cursor()
cursor.execute("SELECT * FROM usuarios")
rows = cursor.fetchall()
if (len(rows) == 0):
print("Sem usuarios")
else:
print("Resultados:")
for row in rows:
print(row)
elif opcao == "5":
cursor.execute("UPDATE usuarios SET nome=?", ["Alguma coisa"])
conexao.commit()
print("Atualizado todos os dados na tabela usuarios com o nome 'Alguma coisa'")
elif opcao == "6":
cursor.execute("DELETE FROM usuarios")
conexao.commit()
print("Apagado todos os usuários")
else:
print("Nenhuma opção válida selecionada, fechando o programa")
opcao = 0
print("")
input("Para continuar, aperte ENTER")
print("")
Aqui utilizamos comandos simples para criar uma aplicação para mexer na tabela usuarios do banco de dados de maneira bem simples. A única coisa de diferente que verá por aqui é o uso da class os
, que nos permite limpar o console usando um comando nativo do sistema operacional, só para a aplicação ficar mais bonita.
E é isso por hoje, obrigado pela atenção e até a próxima.