00 — Setup SQL Server¶
O que este notebook faz¶
Cria o banco seguradora no SQL Server, define a DDL das 11 tabelas relacionais e popula cada uma a partir dos arquivos CSV da pasta data/. É o ponto de partida do pipeline — nada além dele toca o SQL Server diretamente.
Pré-requisito
O container sqlserver precisa estar saudável. Aguarde ~30 segundos após docker-compose up -d para o SQL Server terminar de inicializar.
Etapas¶
-
1. Criar o banco
CREATE DATABASE seguradoravia conexãomaster -
2. DDL das tabelas
11 tabelas com PKs, FKs e tipagem apropriada
-
3. Importar CSVs
csv.DictReader+cursor.execute(INSERT ...)por linha -
4. Validar contagens
SELECT COUNT(*)de cada tabela para conferência
Modelo relacional¶
erDiagram
REGIAO ||--o{ ESTADO : tem
ESTADO ||--o{ MUNICIPIO : possui
MUNICIPIO ||--o{ ENDERECO : localiza
ENDERECO ||--o{ CLIENTE : reside
CLIENTE ||--o{ TELEFONE : tem
CLIENTE ||--o{ APOLICE : possui
APOLICE ||--o{ SINISTRO : gera
APOLICE }o--|| CARRO : cobre
MARCA ||--o{ MODELO : produz
MODELO ||--o{ CARRO : define
Conexão¶
import os
import pyodbc
from dotenv import load_dotenv
load_dotenv()
cn = pyodbc.connect(
f"DRIVER={{ODBC Driver 18 for SQL Server}};"
f"SERVER={os.getenv('SQLSERVER_HOST')},{os.getenv('SQLSERVER_PORT')};"
f"DATABASE=master;"
f"UID={os.getenv('SQLSERVER_USER')};"
f"PWD={os.getenv('SQLSERVER_PASSWORD')};"
f"TrustServerCertificate=yes;",
autocommit=True,
)
cursor = cn.cursor()
Criação do banco¶
DB = "seguradora"
cursor.execute(f"""
IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = '{DB}')
CREATE DATABASE {DB}
""")
cursor.execute(f"USE {DB}")
DDL — exemplo¶
CREATE TABLE cliente (
id_cliente INT PRIMARY KEY,
nome VARCHAR(100) NOT NULL,
cpf VARCHAR(14) NOT NULL UNIQUE,
data_nasc DATE,
email VARCHAR(100),
id_endereco INT FOREIGN KEY REFERENCES endereco(id_endereco)
);
CREATE TABLE apolice (
id_apolice INT PRIMARY KEY,
id_cliente INT FOREIGN KEY REFERENCES cliente(id_cliente),
id_carro INT FOREIGN KEY REFERENCES carro(id_carro),
cobertura VARCHAR(20),
valor_premio DECIMAL(10, 2),
data_inicio DATE,
data_fim DATE
);
Importação dos CSVs¶
import csv
def importar(tabela: str, arquivo: str, colunas: list[str]):
placeholders = ",".join("?" * len(colunas))
sql = f"INSERT INTO {tabela} ({','.join(colunas)}) VALUES ({placeholders})"
with open(f"/data/{arquivo}", encoding="utf-8") as f:
reader = csv.DictReader(f)
for row in reader:
cursor.execute(sql, [row[c] for c in colunas])
cn.commit()
Conferência¶
for t in ["regiao", "estado", "municipio", "endereco", "cliente",
"telefone", "marca", "modelo", "carro", "apolice", "sinistro"]:
cursor.execute(f"SELECT COUNT(*) FROM {t}")
print(f"{t:12s} → {cursor.fetchone()[0]} linhas")
| Tabela | Esperado |
|---|---|
regiao |
5 |
estado |
15 |
municipio |
10 |
endereco |
10 |
cliente |
10 |
telefone |
10 |
marca |
8 |
modelo |
15 |
carro |
10 |
apolice |
10 |
sinistro |
8 |