Código Python: SQLite do zero (criar, inserir, consultar, atualizar, excluir)

Código Python: SQLite do zero (criar, inserir, consultar, atualizar, excluir)
Quando a ficha de estoque vive espalhada em arquivos soltos — uma planilha por mês, uma cópia no computador do balcão e outra no e-mail do contador — o problema de fundo não é a tecnologia: é que ninguém consegue responder a uma pergunta simples com confiança. Quanto vale o depósito hoje. Por quanto saiu a furadeira na semana passada. Quantas fitas isolantes sobraram de verdade. Cada cópia dá a sua própria resposta e nenhuma delas manda. Este programa mostra, em sete passos que aparecem na tela, como essa mesma ficha de estoque fica guardada em um banco SQLite: um único arquivo, com uma única versão da verdade, onde um preço é corrigido em um só lugar e o total aparece sozinho. Ele foi escrito para o dono de um negócio pequeno, para o contador que recebe caixas de comprovantes e para o almoxarife que conta e anota; não é preciso saber programar para acompanhar o que está acontecendo.
Não há motor de banco de dados para instalar, nem licença para pagar, nem internet envolvida. O Python já traz o SQLite dentro e este ZIP traz o resto.
⬇ Baixar o código (ZIP)O que vem no ZIP
| Arquivo do pacote | Para que serve |
|---|---|
sqlite_desde_cero.py | O programa completo, comentado linha por linha em português, com os sete passos. |
datos/productos.csv | Oito produtos de exemplo, com código, nome, categoria, preço e estoque. |
salida_ejemplo.txt | A saída real do programa, para comparar com a que aparecer na sua tela. |
LEIAME.md | As instruções de instalação e de execução, em dois minutos de leitura. |
O que o negócio ganha com um banco de dados no lugar de arquivos soltos
Uma planilha é uma fotografia: serve para o que aparece na foto e para mais nada. Um banco de dados é um arquivo vivo, em que cada produto existe uma única vez e em que as regras valem sempre. Repare no que muda no dia a dia. Primeiro, acabam as cópias rivais: o preço do cabo é um número só, não aquele que o vendedor lembra. Segundo, o arquivo impede dados impossíveis: o programa define o código como chave, então não podem existir dois produtos com o mesmo código, por mais gente que trabalhe ao mesmo tempo. Terceiro, corrigir um preço não obriga ninguém a recalcular nada à mão, porque o valor de cada linha é obtido na hora da consulta. E quarto, o total do estoque e os subtotais por categoria são uma pergunta, e não uma fórmula que alguém colou na coluna ao lado e que se rompe quando uma linha nova é inserida.
Existe ainda uma vantagem que só aparece no dia ruim: o banco é alterado dentro de um bloco que se confirma por inteiro ou se desfaz por inteiro. Se o programa falhar no meio da carga, não fica meio estoque gravado: ou entrou tudo ou não entrou nada. Numa planilha, uma queda de energia no meio da colagem deixa um arquivo em que ninguém confia.
O que o programa faz
- Cria o banco e a tabela de produtos com os seus tipos, na primeira execução.
- Lê os oito produtos do arquivo de exemplo e os insere um por um, com uma consulta parametrizada.
- Consulta a tabela inteira ordenada por código e monta a lista com o valor de cada linha.
- Atualiza o preço do cabo e mostra o preço antes e o preço depois.
- Exclui a fita isolante e confirma quantos produtos continuam na tabela.
- Calcula o valor do estoque por categoria e confere se a soma das categorias bate com o total.
- Fecha a conexão e confirma: se algum passo tivesse falhado, o banco teria ficado como estava.
Como executar
Instale o Python 3.11 ou mais novo a partir do site oficial e marque a caixa que adiciona o Python ao sistema. Descompacte o ZIP em uma pasta confortável, abra o terminal nessa pasta e digite python sqlite_desde_cero.py. Não há nada mais para instalar: o banco vem dentro do Python e todas as outras ferramentas são da biblioteca padrão. Se o comando python não responder, tente py sqlite_desde_cero.py.
O código, explicado
O programa cabe em uma tela e meia e se lê de cima para baixo. Estes são os cinco trechos que vale a pena entender, porque são os que voltam depois em qualquer automação de estoque.
Um: de onde vêm as ferramentas. Quatro importações e nada mais. A segunda é a que interessa ao negócio, porque significa que o banco já vem junto com o Python e a sua cópia de segurança do estoque é um arquivo que se copia como se copia uma fotografia.
import csv # csv: lê os produtos de exemplo de um arquivo de texto
import sqlite3 # sqlite3: o banco de dados vem dentro do Python, nada para instalar
from decimal import Decimal, ROUND_HALF_UP # Decimal: dinheiro não se calcula com decimais binários (float)
from pathlib import Path # pathlib: caminhos que funcionam no Windows, Linux e Mac
Dois: o banco é aberto dentro de um contrato. O bloco with abre a conexão e, na saída, confirma as mudanças pendentes. Se algo der errado no caminho, ele desfaz tudo e deixa o arquivo como estava. Para o dono do negócio, é a diferença entre uma ficha de estoque confiável e uma ficha pela metade.
# with sqlite3.connect(...): abre o banco e, ao sair do bloco, confirma as mudanças
with sqlite3.connect(RUTA_DB) as conexion:
cursor = conexion.cursor()
Três: os dados entram por pontos de interrogação. Aqui está a decisão mais importante do programa e ela quase nunca é explicada nos tutoriais. O texto da consulta é escrito uma única vez, com um ponto de interrogação para cada dado que vai entrar; os valores viajam separados, como uma lista ordenada. A consulta nunca é montada colando texto. A razão de negócio é simples: o nome de um fornecedor, a referência de um produto ou a observação de uma nota podem trazer aspas ou qualquer outro sinal, e se esse texto fosse colado dentro da consulta o motor leria aquilo como uma ordem, e não como um dado. Com parâmetros, o motor sabe sempre o que é ordem e o que é dado; além disso, a mesma consulta roda muitas vezes sem ser analisada de novo, que é exatamente o que se precisa ao carregar centenas de referências.
sql_insert = ("INSERT INTO productos (codigo, producto, categoria, precio, "
"existencias) VALUES (?, ?, ?, ?, ?)")
mostrar_sql(sql_insert)
for producto in productos:
cursor.execute(sql_insert, (
producto["codigo"], producto["produto"],
producto["categoria"], int(producto["preco"]),
int(producto["estoque"]),
))
Quatro: o programa mostra o SQL que vai executar. Esta função parece enfeite e é metade do aprendizado: na tela você lê a ordem no idioma dos bancos de dados, um instante antes de ela rodar. Ao terminar a leitura você já reconhece as poucas instruções do ofício, e são as mesmas usadas por qualquer sistema de estoque sério.
def mostrar_sql(sql: str) -> None:
"""Mostra a instrução SQL que será executada: ver o SQL é metade do aprendizado."""
print(f"SQL: {sql}")
Cinco: a pergunta de negócio, em uma linha. Contar os produtos e somar o valor do depósito agrupado por categoria, do maior para o menor, é exatamente o que o dono quer ver no fechamento do mês. Na planilha isso é uma tabela dinâmica que se refaz toda vez; aqui é uma única instrução que lê sempre os dados do momento.
sql_grupo = ("SELECT categoria, COUNT(*) AS articulos, "
"SUM(precio * existencias) AS valor FROM productos "
"GROUP BY categoria ORDER BY valor DESC")
O que você vai ver na tela
A saída está em português, com os números no formato da casa. Um trecho da consulta e da lista de produtos:
SQL: INSERT INTO productos (codigo, producto, categoria, precio, existencias) VALUES (?, ?, ?, ?, ?) Produtos inseridos: 8 ---------------------------------------------------------------------------------------------- Código Produto Categoria Preço Estoque Valor ---------------------------------------------------------------------------------------------- E01 Cabo THHN 12 AWG (metro) Elétrica 3.600,00 500 1.800.000,00 E02 Disjuntor 20 A Elétrica 42.800,00 24 1.027.200,00 E03 Fita isolante preta Elétrica 5.900,00 200 1.180.000,00 H01 Furadeira de impacto 650 W Ferramentas 289.900,00 12 3.478.800,00 H02 Martelo de bola 16 oz Ferramentas 45.900,00 40 1.836.000,00 H03 Chave ajustável 10 pol Ferramentas 62.900,00 18 1.132.200,00 P01 Tubo PVC 1/2 pol x 3 m Hidráulica 18.900,00 120 2.268.000,00 P02 Registro de gaveta 1/2 pol Hidráulica 34.500,00 35 1.207.500,00 ---------------------------------------------------------------------------------------------- Linhas consultadas: 8
E o fechamento, com o dado que o dono de fato leva para a reunião:
Produtos na tabela: 7 Valor total do estoque: 12.899.700,00 Arquivo gerado: salida/tienda.db
Erros comuns e conselhos
- Rodar o programa duas vezes seguidas não faz sujeira: ele apaga o banco anterior e o cria de novo, então a saída é sempre a mesma e pode ser comparada.
- Se você editar o arquivo de produtos, respeite as vírgulas e os títulos das colunas. Um espaço a mais no nome de uma coluna deixa a carga sem dados.
- O arquivo do banco não abre com duplo clique como uma planilha: é preciso uma ferramenta que fale o idioma das consultas, e é justamente isso que o programa faz.
- Não mova o programa no meio do caminho: ele procura os dados ao lado de si mesmo, portanto, se quiser rodá-lo de outra pasta, mova o pacote inteiro.
- Antes de testar mudanças, copie o arquivo do banco para outra pasta. Copiar um único arquivo é toda a cópia de segurança de que você precisa.
- Os preços são guardados em unidades inteiras, sem centavos binários, e o valor de cada linha é calculado na consulta. Assim o total nunca carrega um centavo de diferença.
Quando isso deixa de bastar
Este programa é o ponto de partida certo quando você quer que a ficha de estoque viva em um só lugar e já perdeu o medo do terminal. Mas chega um momento em que o negócio pede mais: várias pessoas trabalhando ao mesmo tempo, faturamento, compras, relatórios que o contador possa imprimir sem ajuda de ninguém, cópias de segurança automáticas e botões no lugar de linhas de texto. É aí que um programa feito para isso — como o Kardex Tauro, que é gratuito e serve para organizar o estoque — passa a ser a escolha sensata: por dentro continua sendo um banco SQLite, só que você não precisa mais escrevê-lo. Enquanto esse momento não chega, este ZIP e o Kardex Tauro compartilham a mesma ideia de fundo: os dados do negócio são guardados uma única vez e bem guardados.
⬇ Baixar o código (ZIP)Baixe o pacote, rode uma vez e leia a tela com calma. São sete passos e, no fim, o seu estoque já vive em um único banco de dados.