Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
3
respostas

Loja.db Solução

Aqui minha solução

import sqlite3  

def criar_tabela_produtos():
    conn = sqlite3.connect('loja.db') 
    cursor = conn.cursor()
    cursor.execute("""
        CREATE TABLE IF NOT EXISTS produtos (
            id INTEGER PRIMARY KEY,
            nome TEXT,
            preco REAL
        )
    """)
    
    conn.commit()
    conn.close()

def inserir_produto(nome, preco):
    conn = sqlite3.connect('loja.db') 
    cursor = conn.cursor()
    cursor.execute("""
        INSERT INTO produtos (nome, preco) VALUES (?, ?)
    """, (nome, preco))
    
    conn.commit()
    conn.close()

def listar_produtos():
    conn = sqlite3.connect('loja.db') 
    cursor = conn.cursor()
    cursor.execute("""
        SELECT * FROM produtos
    """)
    
    produtos = cursor.fetchall()
    
    for produto in produtos:
        print(produto)
    
    conn.commit()
    conn.close()


if __name__ == "__main__":
    criar_tabela_produtos()
    inserir_produto("Camiseta", 29.99)
    inserir_produto("Calça", 49.99)
    inserir_produto("Tênis", 89.99)
    listar_produtos()
3 respostas
solução!

Olá, Vitor! Como vai?

Parabéns pela resolução da atividade!

Vi que você explorou a biblioteca sqlite3 para criar e manipular um banco de dados com Python, utilizou muito bem a função de inserção com parâmetros para evitar problemas de segurança e ainda compreendeu a importância da consulta e exibição de registros para validar os dados armazenados.

Uma dica interessante para o futuro é encapsular a lógica em uma classe LojaDB, centralizando as operações de criação, inserção e listagem. Assim:

import sqlite3

class LojaDB:
    def __init__(self, nome_banco="loja.db"):
        self.nome_banco = nome_banco

    def conectar(self):
        return sqlite3.connect(self.nome_banco)

    def criar_tabela(self):
        with self.conectar() as conn:
            cursor = conn.cursor()
            cursor.execute("""
                CREATE TABLE IF NOT EXISTS produtos (
                    id INTEGER PRIMARY KEY,
                    nome TEXT,
                    preco REAL
                )
            """)

    def inserir_produto(self, nome, preco):
        with self.conectar() as conn:
            cursor = conn.cursor()
            cursor.execute("INSERT INTO produtos (nome, preco) VALUES (?, ?)", (nome, preco))

    def listar_produtos(self):
        with self.conectar() as conn:
            cursor = conn.cursor()
            cursor.execute("SELECT * FROM produtos")
            return cursor.fetchall()

Isso faz com que o código fique mais organizado e reutilizável, além de facilitar futuras expansões.

Se quiser aprofundar ainda mais, algumas boas práticas são:

  • Usar with para conexões: garante fechamento automático do banco.
  • Adicionar tratamento de exceções: para lidar com erros de conexão ou inserção.
  • Separar lógica de negócio: manter funções de banco isoladas da lógica de interface.

Alguns materiais podem estar em inglês, mas é possível compreendê-los usando o recurso de tradução de páginas do próprio navegador.

Ah, uma pergunta: você acha que organizar o código em uma classe deixa o projeto mais escalável e fácil de manter ou prefere manter funções soltas para simplificar os primeiros exercícios?

Fico à disposição! E se precisar, conte sempre com o apoio do fórum.

Abraço e bons estudos!

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!

Eu na questão acabei seguindo o padrão usado nas aulas, mas usar classes acaba tornando o projeto mais escalonavel e melhor de manter sim.

Olá, Vitor! Tudo bem?

Você trouxe uma ótima reflexão.

Seguir o padrão das aulas ajuda a consolidar fundamentos, mas como você bem destacou, usar classes torna o projeto mais escalável e fácil de manter. Essa organização permite agrupar responsabilidades, reduzir duplicação de código e facilitar futuras evoluções sem comprometer a clareza.

Funções soltas são práticas para exercícios iniciais, mas quando pensamos em projetos maiores, a estrutura orientada a objetos realmente faz diferença na manutenção e na colaboração em equipe.

Parabéns pela análise, mostra que você já está pensando além do exercício imediato e projetando para o futuro do desenvolvimento.

Forte abraço e siga firme nos estudos!