Spec Sistemas Com Python • Trilha Progressiva em 4 Níveis


🎯 Nível 1: Fundamentos

Problema 16.1 — Conexão com SQLite em Memória (:memory:) e Criação de Tabelas

Contexto: Conexão com SQLite em Memória (:memory:) e Criação de Tabelas no contexto de Acesso a Dados com SQLite3 Nativo, Transações ACID e DAO.

Requisitos de Execução:

  1. Criar banco de dados relacional em memória e tabela com chave primária e campos tipados.

Resultado Esperado

Banco relacional SQLite instanciado e estruturado.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_16_1_SeuNome
  2. Envie na tarefa: Atividade Cap 16 - Acesso a Dados com SQLite3 Nativo, Transações ACID e DAO
🔑 Gabarito de Código & Solução Comentada
import sqlite3

conn = sqlite3.connect(":memory:")
cursor = conn.cursor()
cursor.execute("""
    CREATE TABLE usuarios (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        nome TEXT NOT NULL,
        email TEXT UNIQUE NOT NULL
    )
""")
conn.commit()
print("Tabela 'usuarios' criada com sucesso no SQLite em memoria.")

🔍 Nível 2: Prática

Problema 16.2 — Consultas Parametrizadas contra SQL Injection e Row Factory

Contexto: Consultas Parametrizadas contra SQL Injection e Row Factory no contexto de Acesso a Dados com SQLite3 Nativo, Transações ACID e DAO.

Requisitos de Execução:

  1. Configurar conn.row_factory = sqlite3.Row permitindo acesso a colunas por nome e tuplas.

Resultado Esperado

Consultas parametrizadas executadas com mapeamento de dicionário seguro.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_16_2_SeuNome
  2. Envie na tarefa: Atividade Cap 16 - Acesso a Dados com SQLite3 Nativo, Transações ACID e DAO
🔑 Gabarito de Código & Solução Comentada
import sqlite3

conn = sqlite3.connect(":memory:")
conn.row_factory = sqlite3.Row
cursor = conn.cursor()

cursor.execute("CREATE TABLE produtos (id INT, nome TEXT, preco REAL)")
cursor.execute("INSERT INTO produtos VALUES (?, ?, ?)", (1, "Mouse", 120.0))
conn.commit()

cursor.execute("SELECT * FROM produtos WHERE id = ?", (1,))
row = cursor.fetchone()
if row:
    print(f"Produto: {row['nome']} -> R$ {row['preco']:.2f}")

⚡ Nível 3: Integração

Problema 16.3 — Gestão Transacional ACID com Context Managers (with conn:)

Contexto: Gestão Transacional ACID com Context Managers (with conn:) no contexto de Acesso a Dados com SQLite3 Nativo, Transações ACID e DAO.

Requisitos de Execução:

  1. Executar lote de inserções dentro do bloco with conn: com commit automático e rollback em exceções.

Resultado Esperado

Transação atômica gerenciada com rollback automático.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_16_3_SeuNome
  2. Envie na tarefa: Atividade Cap 16 - Acesso a Dados com SQLite3 Nativo, Transações ACID e DAO
🔑 Gabarito de Código & Solução Comentada
import sqlite3

conn = sqlite3.connect(":memory:")
with conn:
    conn.execute("CREATE TABLE contas (id INT, saldo REAL)")
    conn.execute("INSERT INTO contas VALUES (1, 1000.0), (2, 500.0)")

try:
    with conn: # Transação ACID
        conn.execute("UPDATE contas SET saldo = saldo - 200 WHERE id = 1")
        conn.execute("UPDATE contas SET saldo = saldo + 200 WHERE id = 2")
    print("Transferencia bancaria concluida com commit!")
except Exception as e:
    print("Rollback executado:", e)

🏆 Nível 4: Desafio Corporativo

Problema 16.4 — Padrão DAO (Data Access Object) Completo com Tipagem Estrita

Contexto: Padrão DAO (Data Access Object) Completo com Tipagem Estrita no contexto de Acesso a Dados com SQLite3 Nativo, Transações ACID e DAO.

Requisitos de Execução:

  1. Implementar UsuarioDAO isolando operações de CRUD da camada de serviços.

Resultado Esperado

Camada de persistência desacoplada através do padrão DAO corporativo.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_16_4_SeuNome
  2. Envie na tarefa: Atividade Cap 16 - Acesso a Dados com SQLite3 Nativo, Transações ACID e DAO
🔑 Gabarito de Código & Solução Comentada
from dataclasses import dataclass
import sqlite3

@dataclass
class Usuario:
    id: int
    nome: str

class UsuarioDAO:
    def __init__(self, conn: sqlite3.Connection) -> None:
        self.conn = conn

    def buscar_por_id(self, id: int) -> Usuario | None:
        cur = self.conn.cursor()
        cur.execute("SELECT id, nome FROM usuarios WHERE id = ?", (id,))
        row = cur.fetchone()
        return Usuario(row[0], row[1]) if row else None

print("UsuarioDAO tipado homologado.")