Conteúdo

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:

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.