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




Fernanda, você trouxe um excelente exemplo de como estruturas de dados podem ser aplicadas de forma prática, com uma abordagem didática. O projeto de Agenda Inteligente utilizando Python e SQLite permite que o desenvolvedor se aproxime de conceitos complexos de forma intuitiva e funcional.
Você também abordou a combinação de várias estruturas de dados para resolver problemas do dia a dia, o que é uma forma poderosa de demonstrar sua utilidade em aplicações reais.
A ideia de expandir o projeto para um frontend e integrar com PostgreSQL são ótimas maneiras de levar o projeto para um nível mais avançado.
Como sugestão, além das expansões futuras, o que você acha de incluir a integração com APIs externas para obter dados em tempo real, como tarefas ou lembretes?
Obrigada pelo feedback @Michel
Fico feliz que gostou, python é super pratico e versátil mesmo... lida muito bem com dados 🤩
Tenho um outro projeto bem parecido inspirado em uma agenda Kanban, pode implementar banco de dados com azure ou aws, utilizar llms para lembretes, pode usar usa criatividade.
Que projeto incrível! Parabéns pelo detalhamento — ficou super didático, principalmente a forma como vocês explicaram o uso das estruturas de dados (listas, filas, pilhas, árvores) e integraram com SQLite.Gostei muito da ideia de construir uma agenda totalmente em Python, unindo teoria e prática de forma tão clara. Deu vonta de testar e adaptar no meu próprio ritmo e até ver algumas ideias que posso implementar.
Obrigado por compartilhar um guia tão completo, com certeza vai ajudar muita gente a dar o primeiro passo ou a aprofundar os conhecimentos!