Nesta atividade você cria um banco relacional de Gestão de Produtos e Categorias, executa o ciclo completo do CRUD (Create, Read, Update, Delete) e responde a perguntas de negócio sobre o estoque usando SQL e Pandas.
Desenvolver um script em Python que cria o banco, executa as operações de escrita de forma segura e responde a perguntas de análise sobre o estoque.
Cada passo em uma célula
No Colab, coloque cada bloco de código em uma célula separada e execute na ordem. Se precisar recomeçar, volte ao Passo 1 e execute tudo de novo. O Passo 2 recria as tabelas do zero.
Passo a passo
Passo 1: conectar ao banco
Importe as bibliotecas e abra a conexão com o arquivo .db. Se o arquivo não existir, o SQLite o cria automaticamente.
import sqlite3import pandas as pd# Abre (ou cria) o banco de dados localconn = sqlite3.connect("gestao_produtos.db")# O cursor envia comandos SQL e recebe os resultadoscursor = conn.cursor()print("Conexão estabelecida com sucesso!")
Erro de digitação cria outro banco
Se você escrever gestao_produto.db (sem o “s”), o SQLite não avisa: cria um banco novo e vazio. Se aparecer no such table, confira o nome do arquivo.
Passo 2: criar as tabelas (DDL)
Defina duas tabelas, Categoria e Produto, com chave primária, chave estrangeira e validações CHECK.
# O SQLite só verifica chaves estrangeiras se você pedir, a cada conexãocursor.execute("PRAGMA foreign_keys = ON;")cursor.executescript('''DROP TABLE IF EXISTS Vendas;DROP TABLE IF EXISTS Produto;DROP TABLE IF EXISTS Categoria;CREATE TABLE Categoria ( id_categoria INTEGER PRIMARY KEY AUTOINCREMENT, nome_categoria TEXT NOT NULL);CREATE TABLE Produto ( id_produto INTEGER PRIMARY KEY AUTOINCREMENT, nome TEXT NOT NULL, preco REAL NOT NULL CHECK(preco >= 0.0), estoque INTEGER NOT NULL CHECK(estoque >= 0), id_categoria INTEGER, FOREIGN KEY (id_categoria) REFERENCES Categoria(id_categoria));''')conn.commit()print("Tabelas 'Categoria' e 'Produto' criadas com sucesso!")
O DROP apaga dados
Os comandos DROP TABLE no início do script apagam as tabelas e todo o conteúdo. Eles garantem que a atividade possa ser repetida sem duplicar registros, mas nunca devem ser usados assim em um sistema real.
Passo 3: inserir registros (Create)
Para evitar SQL Injection, nunca monte o comando juntando textos. Use marcadores de posição (?) com cursor.executemany(), que insere vários registros de uma vez.
Edições e remoções pontuais sempre usam a cláusula WHERE. Sem ela, o comando atinge todas as linhas da tabela.
# 1. Atualizar o preço de um produtocursor.execute( "UPDATE Produto SET preco = ? WHERE nome = ?;", (1600.00, "Smartphone"))print("Linhas atualizadas:", cursor.rowcount)# 2. Excluir um produtocursor.execute("DELETE FROM Produto WHERE nome = ?;", ("Calça Jeans",))print("Linhas excluídas:", cursor.rowcount)conn.commit()
Confira o rowcount
Se rowcount for 0, o WHERE não encontrou nada, normalmente por erro de digitação no nome. O SQLite não considera isso um erro, então a verificação é sua.
Execute novamente o código do Passo 4 e confirme que o Smartphone custa R$ 1600,00 e que a Calça Jeans sumiu.
Passo 6: análise de dados
Agora cruze as tabelas com JOIN e use funções de agregação para responder perguntas de negócio.
Pergunta 1 (SQL): qual o valor investido em estoque por categoria?
query_estoque_categoria = """SELECT c.nome_categoria, COUNT(p.id_produto) AS total_produtos, SUM(p.preco * p.estoque) AS valor_total_estoqueFROM Categoria cJOIN Produto p ON c.id_categoria = p.id_categoriaGROUP BY c.nome_categoriaORDER BY valor_total_estoque DESC;"""cursor.execute(query_estoque_categoria)print("\n--- Valor Total de Estoque por Categoria ---")for categoria, qtd, valor in cursor.fetchall(): print(f"Categoria: {categoria} | Variedade: {qtd} item(ns) | Valor em Estoque: R$ {valor:.2f}")
Resultado esperado
Categoria
Itens
Valor em estoque
Eletrônicos
2
R$ 33.500,00
Móveis
2
R$ 6.600,00
Vestuário
1
R$ 2.000,00
Pergunta 2 (Pandas): qual o resumo estatístico dos preços e estoques?
O Pandas lê o resultado de uma consulta direto em um DataFrame com pd.read_sql_query().
df_produtos = pd.read_sql_query(""" SELECT p.nome, p.preco, p.estoque, c.nome_categoria FROM Produto p JOIN Categoria c ON p.id_categoria = c.id_categoria""", conn)print("\n--- Visão Geral do DataFrame ---")print(df_produtos.head())print("\n--- Resumo Estatístico ---")print(df_produtos.describe())
Resultado esperado
No describe(), a coluna preco deve mostrar média 1266.00 e a coluna estoque, média 11.00, ambas com count igual a 5.
Passo 7: fechar a conexão
Encerre o cursor e a conexão para liberar os recursos.
cursor.close()conn.close()print("Conexão encerrada com segurança.")
Exercícios de fixação
Exercício 1
Liste os produtos com estoque menor que 10, do menor para o maior estoque. (Reabra a conexão antes, repetindo o Passo 1.)
Solução do exercício 1
cursor.execute("SELECT nome, estoque FROM Produto WHERE estoque < ? ORDER BY estoque;", (10,))print(cursor.fetchall())# [('Sofá', 3), ('Notebook', 5)]
Exercício 2
Com o DataFramedf_produtos, calcule o preço médio por categoria.
Tente inserir um produto com preço negativo. O que acontece e por quê?
Solução do exercício 3
O banco recusa a linha com sqlite3.IntegrityError: CHECK constraint failed, porque a coluna preco foi definida com CHECK(preco >= 0.0). A regra de negócio fica protegida no próprio banco, mesmo que o código Python esqueça de validar.
Erros comuns
Sintoma
Causa provável
Como corrigir
Inseriu um produto com id_categoria inexistente e nada aconteceu
PRAGMA foreign_keys = ON não foi executado nesta conexão
Execute o PRAGMA toda vez que abrir uma conexão
Os dados somem ao reabrir o banco
commit() esquecido
Chame conn.commit() após INSERT, UPDATE e DELETE
Cannot operate on a closed database
Executou uma célula depois do Passo 7
Repita o Passo 1 para abrir nova conexão
no such table
Banco aberto com nome errado ou tabelas ainda não criadas
Confira o nome do arquivo e execute o Passo 2
Registros duplicados
Executou o Passo 3 duas vezes sem recriar as tabelas
Execute a partir do Passo 2, que recria tudo
Checklist de verificação
O arquivo gestao_produtos.db foi criado
O Passo 4 lista 6 produtos antes do Passo 5
Após o Passo 5, o Smartphone custa R$ 1600,00 e a Calça Jeans não aparece
A Pergunta 1 retorna Eletrônicos como categoria de maior valor em estoque
A conexão foi fechada no Passo 7
Os três exercícios de fixação foram resolvidos
Próximo passo
Continue em Vendas e estoque, onde você adiciona a tabela de vendas e descobre o produto mais vendido.