🧩 Exercícios: Acesso a Dados com SQLite3 Nativo, Transações ACID e DAO
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:
- 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)
- Salve o arquivo como:
Atividade_16_1_SeuNome - 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:
- Configurar
conn.row_factory = sqlite3.Rowpermitindo acesso a colunas por nome e tuplas.
Resultado Esperado
Consultas parametrizadas executadas com mapeamento de dicionário seguro.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_16_2_SeuNome - 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:
- 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)
- Salve o arquivo como:
Atividade_16_3_SeuNome - 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:
- Implementar
UsuarioDAOisolando 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)
- Salve o arquivo como:
Atividade_16_4_SeuNome - 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.")