Python oferece um excelente suporte a bancos de dados, integrando-se perfeitamente à sua biblioteca padrão. Isso possibilita criar e interagir com um banco de dados sem a necessidade de frameworks externos como o Django ORM.
O SQLite se destaca como uma opção leve e de fácil integração com Python. Vamos explorar os fundamentos da programação de bancos de dados em Python por meio de um aplicativo simples de registro de usuários.
Como Criar um Banco de Dados em Python
Para estabelecer uma comunicação eficaz com um banco de dados em Python, dois componentes são essenciais: uma conexão e um cursor.
A conexão serve como a ponte que permite o acesso a um banco de dados existente ou a criação de um novo. Veja como estabelecer uma conexão com o SQLite:
import sqlite3
conexao = sqlite3.connect('caminho/para/banco_de_dados.db')
conexao.close()
O método `connect()` busca o caminho para um banco de dados pré-existente. Caso não haja banco de dados no local indicado, ele cria um novo. É imprescindível fechar a conexão após o uso.
O cursor atua como um intermediário, permitindo a interação com o banco de dados. É através dele que executamos consultas SQL em nossos programas Python. Veja como criar um cursor:
cursor = conexao.cursor()
cursor.close()
Um cursor é obtido chamando o método `cursor()` em um objeto de conexão aberta.
Como Executar Transações em um Banco de Dados com Python
Utilizando o cursor, torna-se possível executar instruções SQL, consultas e scripts para manipular dados ou modificar a estrutura do banco de dados.
Existem três métodos principais para realizar transações:
cursor.execute("""
CREATE TABLE IF NOT EXISTS usuarios (
nome TEXT,
idade INTEGER
)
""")
Este trecho de código invoca o método `execute` passando uma string que contém a instrução SQL.
dados = [
('Alice', 25),
('Bob', 30),
('Charlie', 22)
]
cursor.executemany("INSERT INTO usuarios (nome, idade) VALUES (?, ?)", dados)
O código acima usa o método `executemany` para inserir vários registros no banco de dados.
Note os marcadores `?` na instrução SQL. O método `executemany` os substituirá pelos valores correspondentes em cada objeto.
with open("caminho/para/script.sql") as arquivo:
script_sql = arquivo.read()
cursor.executescript(script_sql)
Como Construir um Aplicativo de Registro com Python e SQLite3
A lógica de um aplicativo de registro envolve coletar informações do usuário usando Python e armazená-las em um banco de dados. Os passos a seguir demonstrarão como criar um sistema de registro simplificado com Python e SQLite3.
Passo 1: Conectar a um Banco de Dados Existente ou Criar um Novo
Comece criando um banco de dados para seu aplicativo ou conectando-se a um já existente:
import sqlite3
conexao = sqlite3.connect('banco_dados.db')
cursor = conexao.cursor()
cursor.close()
conexao.close()
O código acima cria um objeto de conexão e um cursor para interagir com o banco de dados.
Passo 2: Criar uma Tabela para Usuários
Você precisa de uma tabela para armazenar os dados que os usuários fornecerão ao se registrar. Veja como criá-la com o cursor:
cursor.execute("""
CREATE TABLE IF NOT EXISTS usuarios (
primeiro_nome TEXT,
ultimo_nome TEXT,
email TEXT UNIQUE,
senha TEXT
)
""")
conexao.commit()
Este código criará uma tabela chamada `usuarios`, caso ela não exista. Ele define quatro colunas para armazenar informações do usuário. O campo `email` é único para impedir que usuários criem múltiplas contas com o mesmo endereço.
A chamada para `conexao.commit()` é crucial para confirmar a consulta no banco de dados. Sem ela, as alterações não serão salvas.
Ao usar `executescript`, você pode incluir a palavra-chave `COMMIT` ao final do arquivo SQL, evitando a necessidade de chamar `conexao.commit()`.
Passo 3: Coletar Dados do Usuário
As funções Python facilitam a reutilização de código. É recomendável criar uma função para gerenciar o processo de registro. Esta função coleta o nome, sobrenome, email e senha do usuário.
def registrar_usuario():
primeiro_nome = input("Digite seu primeiro nome: ")
ultimo_nome = input("Digite seu último nome: ")
email = input("Digite seu email: ")
senha1 = input("Digite sua senha: ")
senha2 = input("Confirme sua senha: ")
Passo 4: Verificar a Correção da Senha
Modifique a função `registrar_usuario` para garantir que o usuário digite a mesma senha duas vezes. Caso contrário, o programa deve solicitar que o usuário digite as senhas novamente. Isso pode ser feito com um loop:
def registrar_usuario():
primeiro_nome = input("Digite seu primeiro nome: ")
ultimo_nome = input("Digite seu último nome: ")
email = input("Digite seu email: ")
while True:
senha1 = input("Digite sua senha: ")
senha2 = input("Confirme sua senha: ")
if senha1 == senha2:
print("Registro realizado com sucesso!")
break
else:
print("As senhas devem coincidir.")
Com essa alteração, o usuário só conseguirá registrar-se se as senhas coincidirem.
Passo 5: Verificar a Exclusividade do Email
A instrução SQL que cria a tabela `usuarios` define o campo `email` como único. Isso significa que o banco de dados retornará um erro se um usuário tentar se registrar com um email já existente. É necessário lidar com essa exceção do Python:
def registrar_usuario():
primeiro_nome = input("Digite seu primeiro nome: ")
ultimo_nome = input("Digite seu último nome: ")
while True:
email = input("Digite seu email: ")
senha1 = input("Digite sua senha: ")
senha2 = input("Confirme sua senha: ")
if senha1 == senha2:
try:
print("Conta criada com sucesso!")
break
except sqlite3.IntegrityError:
print("Erro: Este email já está registrado.")
else:
print("As senhas devem coincidir.")
Este código utiliza o bloco `try-except` para tratar o erro que ocorre com emails duplicados. Se o banco de dados gerar um `IntegrityError`, o loop `while` continuará, pedindo ao usuário para inserir um email diferente.
Para este exemplo, podemos assumir que um `IntegrityError` ocorrerá somente devido a emails duplicados. Em um aplicativo real, você provavelmente usaria um tratamento de erros mais robusto para lidar com outros problemas que possam surgir.
Passo 6: Inserir os Dados do Usuário no Banco de Dados
Após coletar e validar os dados do usuário, é hora de adicioná-los ao banco de dados. Isso pode ser feito por meio de uma consulta SQL. Modifique seu bloco `try-except` da seguinte forma:
try:
cursor.execute("""
INSERT INTO usuarios (primeiro_nome, ultimo_nome, email, senha)
VALUES (?, ?, ?, ?)
""", (primeiro_nome, ultimo_nome, email, senha2))
conexao.commit()
print("Conta criada com sucesso!")
break
except sqlite3.IntegrityError:
print("Erro: Este email já está registrado.")
No bloco `try-except` modificado, o cursor executa uma operação de inserção SQL. O método `conexao.commit()` confirma a operação no banco de dados.
Se você seguiu todos os passos acima, deverá ter um aplicativo que registra usuários e os salva em um banco de dados. Você pode usar um aplicativo como Navegador de banco de dados para SQLite para visualizar o conteúdo do seu banco de dados:
Usando Bancos de Dados em Vez de Tipos de Coleção
Para bancos de dados simples, pode ser mais fácil construir seu próprio código. No entanto, à medida que sua aplicação cresce e seu banco de dados se torna mais complexo, considere usar ferramentas como Django ORM para simplificar o processo.
Para continuar praticando suas habilidades em bancos de dados, tente implementar um sistema de login para complementar o programa de registro.