Unindo Estrutura de Dados e Banco de Dados com Python – criando uma Agenda Inteligente
Guia prático para quem quer aprender estruturas de dados na prática com Python e SQLite, construindo uma aplicação funcional, persistente e lógica. 👩🏻💻✔️
📌 Pré-requisitos
Antes de começar, tenha isso preparado:
- Python 3.10 (instalado)
- Git instalado e uma conta no github (pode usar o desktop também, se quiser instalar...)
- VSCode ou sua IDE favorita
- Terminal integrado funcionando (com git e github tudo pronto para o versionamento)
> Obs: Todo o projeto é backend
📌 Estrutura do Projeto
agenda-inteligente/
├── agenda.py
├── estrutura_arvore.py
├── .gitignore
└── tarefas.db
📌 Criando a pasta do projeto
Abra o terminal (bash dentro do terminal do próprio VSCode) e execute:
mkdir agenda-inteligente
cd agenda-inteligente
code . --reuse-window
Criando os arquivos necessários:
touch agenda.py estrutura_arvore.py
O arquivo tarefas.db
será criado automaticamente na primeira execução do Python, então não crie ele manualmente.
📌 Inicializando o Git no projeto
No terminal vscode:
git init
Isso cria uma pasta oculta .git/
e permite versionar o projeto com Git.
Criando o .gitignore
(opcional, mas recomendado):
echo __pycache__/ > .gitignore && echo tarefas.db >> .gitignore
🔹 > : cria o arquivo e escreve a primeira linha
🔹 >> : adiciona a segunda linha
Criado o arquivo chamado .gitignore
agora escreva no arquivo:
__pycache__/
tarefas.db
Isso impede que o Git envie arquivos desnecessários (como cache do Python e o banco SQLite local).
Agora, vamos para a criação dos códigos, dentro dos arquivos já criados...
▪️Criando o banco de dados com SQLite usando Python
📄 agenda.py
import sqlite3
def criar_banco():
with sqlite3.connect("tarefas.db") as conn:
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS tarefas (
id INTEGER PRIMARY KEY AUTOINCREMENT,
titulo TEXT NOT NULL,
prioridade TEXT CHECK(prioridade IN ('Alta', 'Média', 'Baixa')),
status TEXT CHECK(status IN ('Pendente', 'Em andamento', 'Concluída')) DEFAULT 'Pendente',
data_criacao DATETIME DEFAULT CURRENT_TIMESTAMP
);
""")
print("Banco criado com sucesso!")
Essa função cria o banco e garante que a tabela só será criada uma vez.
▪️ Inserindo tarefas e usando listas
📄 agenda.py
(adicione abaixo da função criar_banco
)
def inserir_tarefa(titulo, prioridade):
with sqlite3.connect("tarefas.db") as conn:
cursor = conn.cursor()
cursor.execute("""
INSERT INTO tarefas (titulo, prioridade) VALUES (?, ?)
""", (titulo, prioridade))
print(f"📝 Tarefa '{titulo}' adicionada!")
Aqui usamos listas no sentido de recuperar/exibir todas as tarefas salvas...
def listar_tarefas():
with sqlite3.connect("tarefas.db") as conn:
cursor = conn.cursor()
cursor.execute("SELECT * FROM tarefas")
for t in cursor.fetchall():
print(f"[{t[0]}] {t[1]} | Prioridade: {t[2]} | Status: {t[3]}")
▪️Usando Fila para tarefas pendentes
📄 agenda.py
from collections import deque
def carregar_fila():
fila = deque()
with sqlite3.connect("tarefas.db") as conn:
cursor = conn.cursor()
cursor.execute("SELECT * FROM tarefas WHERE status = 'Pendente' ORDER BY data_criacao")
for row in cursor.fetchall():
fila.append(row)
return fila
Fila é uma estrutura FIFO (First In, First Out). Aqui usamos para manter a ordem cronológica.
▪️Usando Pilha para histórico de tarefas concluídas
pilha_concluidas = []
def executar_fila():
fila = carregar_fila()
while fila:
tarefa = fila.popleft()
print(f"Executando: {tarefa[1]} (Prioridade: {tarefa[2]})")
atualizar_status(tarefa[0], "Concluída")
pilha_concluidas.append(tarefa)
def atualizar_status(id, novo_status):
with sqlite3.connect("tarefas.db") as conn:
cursor = conn.cursor()
cursor.execute("UPDATE tarefas SET status = ? WHERE id = ?", (novo_status, id))
A pilha (LIFO) armazena tarefas concluídas para você reverter se quiser.
▪️Usando Árvore para organizar tarefas
📄 estrutura_arvore.py
class No:
def __init__(self, tarefa):
self.tarefa = tarefa
self.esquerda = None
self.direita = None
def prioridade_valor(p):
return {"Baixa": 1, "Média": 2, "Alta": 3}[p]
def inserir(raiz, tarefa):
if not raiz:
return No(tarefa)
if prioridade_valor(tarefa[2]) < prioridade_valor(raiz.tarefa[2]):
raiz.esquerda = inserir(raiz.esquerda, tarefa)
else:
raiz.direita = inserir(raiz.direita, tarefa)
return raiz
def em_ordem(raiz):
if raiz:
em_ordem(raiz.esquerda)
print(f"{raiz.tarefa[1]} - {raiz.tarefa[2]}")
em_ordem(raiz.direita)
📄 agenda.py
(adicionar import e uso):
from estrutura_arvore import inserir, em_ordem
def organizar_com_arvore():
raiz = None
with sqlite3.connect("tarefas.db") as conn:
cursor = conn.cursor()
cursor.execute("SELECT * FROM tarefas")
for t in cursor.fetchall():
raiz = inserir(raiz, t)
print("Tarefas organizadas por prioridade:")
em_ordem(raiz)
▪️Como Rodar o Projeto
No terminal bash:
python agenda.py
Agora coloque esse trecho no final do seu arquivo agenda.py
:
python
if __name__ == "__main__":
criar_banco()
inserir_tarefa("Estudar Python", "Alta")
inserir_tarefa("Estudar Java", "Baixa")
listar_tarefas()
executar_fila()
organizar_com_arvore()
▪️Como deve ficar todo o seu arquivo 'agenda.py', com a ultima função 'executar_fila()':
def executar_fila():
fila = carregar_fila()
while fila:
tarefa = fila.popleft()
print(f"Executando: {tarefa[1]} (Prioridade: {tarefa[2]})")
atualizar_status(tarefa[0], "Concluída")
pilha_concluidas.append(tarefa)
Feche e abra o terminal, e vamos testar:
Acesse a pasta do projeto
cd caminho/da/sua/pasta/...
no meu caso:
cd /c/Users/Fernanda/OneDrive/Documentos/Projetos/agenda-inteligente
Execute o projeto:
python agenda.py
logo após sairá o seu resultado no terminal...
✔️ Testando
- Teste inserindo tarefas manualmente e rodando as funções.
- Use
listar_tarefas()
para ver tudo. - Use
executar_fila()
para simular o dia a dia. - Use
organizar_com_arvore()
para ver ordenação por prioridade.
🧠 Expansões Futuras
- Criar interface com Flask ou Streamlit 🧑💻
- Conectar com PostgreSQL para produção
- Adicionar login e usuários (front end)
- Exportar para CSV ou JSON
- Desfazer tarefas com a pilha
- Deploy na nuvem (AWS, Azure, etc.)
📚 Conclusão
Com poucas linhas de Python puro, você aprendeu:
- Como usar listas, filas, pilhas e árvores no mundo real
- Como persistir dados com SQLite
- Como aplicar lógica de programação de forma didática e modular
- Como criar um sistema inteligente, funcional e extensível