1
resposta

[Dúvida] Esta conforme ?

import sqlite3

class Banco_dados:
    def __init__(self, nome_db="loja.db"):
        self.nome_db = nome_db
        self.conexao = None

    def conectar(self):
        if not self.conexao:
            self.conexao = sqlite3.connect(self.nome_db)
            print("Conexao SQLite OK")
        return self.conexao

    def fechar(self):
        if self.conexao:
            self.conexao.close()
            self.conexao = None
            print("Conexao SQLite fechada")
from loja_db import Banco_dados

class CriarBanco:
    def __init__(self, banco_dados: Banco_dados):
        self.banco_dados = banco_dados

    def criar_tabela(self):
        conn = self.banco_dados.conectar()

        try:
            cursor = conn.cursor()
            cursor.execute("""
                CREATE TABLE IF NOT EXISTS loja (
                    id INTEGER PRIMARY KEY AUTOINCREMENT,
                    nome TEXT NOT NULL,
                    preco REAL NOT NULL
                )
            """)
            conn.commit()
            print("Tabela criada ou verificada com sucesso")

        except Exception as e:
            conn.rollback()
            raise e
class Loja:
    def __init__(self, nome, preco, id=None):
        self.id = id
        self.nome = nome
        self.preco = preco
from loja import Loja
from loja_db import Banco_dados

class LojaDAO:
    def __init__(self, banco_dados: Banco_dados):
        self.banco_dados = banco_dados

    def inserir(self, loja: Loja):
        conn = self.banco_dados.conectar()

        try:
            cursor = conn.cursor()
            cursor.execute(
                "INSERT INTO loja (nome, preco) VALUES (?, ?)",
                (loja.nome, loja.preco)
            )
            conn.commit()

        except Exception as e:
            conn.rollback()
            raise e

    def listar(self):
        conn = self.banco_dados.conectar()

        cursor = conn.cursor()
        cursor.execute("SELECT id, nome, preco FROM loja")
        registros = cursor.fetchall()

        return [Loja(id=r[0], nome=r[1], preco=r[2]) for r in registros]
from loja_db import Banco_dados
from criador_bd import CriarBanco
from lojaDao import LojaDAO
from loja import Loja

def main():
    banco = Banco_dados("loja.db")

    criador = CriarBanco(banco)
    criador.criar_tabela()

    dao = LojaDAO(banco)

    dao.inserir(Loja(nome="Produto Teste", preco=19.90))
    dao.inserir(Loja(nome="Arroz", preco=20.00))

    for loja in dao.listar():
        print(loja.id, loja.nome, loja.preco)

    banco.fechar()

if __name__ == "__main__":
    main()
1 resposta

Oii, Samuel! Tudo bem?

Fico muito feliz em ver seu código. Você não apenas resolveu o desafio, como foi muito além do básico.

Para responder à sua pergunta: Sim, o código está funcional e a lógica está correta. Porém, em termos de conformidade estrita com o enunciado do desafio, existem alguns pequenos detalhes de nomenclatura e quantidade que diferem, mas a sua estrutura de código (arquitetura) está, na verdade, superior ao que foi pedido.

O que você fez:

O desafio pedia scripts simples com funções soltas (def criar_produto...). Você entregou uma estrutura orientada a objetos usando o padrão DAO (Data Access Object).

  • Organização: Você separou a responsabilidade de conectar (Banco_dados), de modelar o objeto (Loja), de criar a estrutura (CriarBanco) e de manipular os dados (LojaDAO). Isso é excelente e é assim que sistemas reais são construídos!
  • Segurança: Usou try/except com rollback, o que previne que o banco fique corrompido se der erro no meio do caminho.
  • Boas práticas: Ao fazer Loja(id=r[0], nome=r[1]...), você usou argumentos nomeados, o que evita erros caso a ordem dos parâmetros mude na classe.

Pontos de atenção (Para conformidade com o desafio):

  • Nome da tabela:

  • No desafio: Pede para criar uma tabela chamada produtos.

  • No seu código: Você criou a tabela loja (CREATE TABLE IF NOT EXISTS loja...).

  • Sugestão: Mude a query SQL para CREATE TABLE IF NOT EXISTS produtos.

  • Quantidade de inserções:

  • No desafio: "Insira 3 produtos diferentes".

  • No seu código: Você inseriu 2 (Produto Teste e Arroz).

  • Sugestão: Adicione mais um dao.inserir(...) no seu main.

Uma pequena dica visual (Diagrama):

Para você visualizar como seu código está organizado em comparação com o que foi pedido, veja esta estrutura:

No modelo simples (pedido), o código acessa o banco diretamente. No seu modelo (DAO), existe uma camada intermediária que protege e organiza o acesso aos dados.

Parabéns pela iniciativa de modularizar o código!

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