Adicione um banco de dados no seu runbook
Esse tutorial te guia conectando seu primeiro banco no httui e misturando blocos SQL com blocos HTTP no mesmo runbook — o fluxo que transforma “verifica se staging bate com o DB” numa tarefa de 30 segundos em vez de três ferramentas e um shell.
Vamos usar SQLite pra você não precisar instalar Postgres nem
rodar docker — o httui cria o arquivo .sqlite na primeira run.
Tempo: ~15 minutos · Pré-requisitos: terminou o Quickstart.
1. Adicione a conexão
Seção intitulada “1. Adicione a conexão”No sidebar, clique no ícone de banco (Connections). No painel da direita:
- Clique em + Add connection.
- Escolha SQLite no dropdown Type.
- Name:
local— curtinho, isso vira parte do nome do fence do bloco. - Path:
./scratch.sqlite(relativo à raiz do seu vault). - Clique em Save.
Isso escreve um bloco no connections.toml:
[connections.local]type = "sqlite"path = "./scratch.sqlite"2. Crie uma tabela (bloco DB — mutação)
Seção intitulada “2. Crie uma tabela (bloco DB — mutação)”Crie runbooks/users-check.md. Adicione um título curto e intro:
# Sanity check de users
SQLite local pra imitar a tabela de users que vamos consultar emstaging.Depois adicione um bloco DB (o fence é db-<connection-name>):
```db-localCREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, email TEXT, created_at INTEGER DEFAULT (unixepoch()));
INSERT INTO users (name, email)VALUES ('Alice', 'alice@example.com'), ('Bob', 'bob@example.com'), ('Charlie', 'charlie@example.com')ON CONFLICT DO NOTHING;```O fence é db-local — isso é db- + o nome da conexão do passo 1.
Cada conexão auto-registra seu próprio tipo de bloco.
Aperte Cmd+Enter no bloco. Você vai ver um banner primeiro:
⚠ Esse bloco contém
INSERT. Rodar mesmo assim?
Esse é o mutation guard — o scanner SQL do httui flagueou uma statement destrutiva e tá perguntando antes de deixar você reescrever produção sem querer. Clique em Run once. O bloco roda e você vê “3 rows affected”.
3. Faça query de volta (bloco DB — SELECT)
Seção intitulada “3. Faça query de volta (bloco DB — SELECT)”Adicione um bloco SELECT:
```db-local alias=users_listSELECT id, name, email, created_atFROM usersORDER BY id```Aperte Cmd+Enter. A response é uma grid virtualizada — colunas
ordenáveis, badge de tipo por coluna, botão copy-as-CSV. Teste o
sort no header da coluna e repare que é instantâneo mesmo em 100k
linhas (a grid é janelada).
O alias=users_list importa pro próximo passo.
4. Encadeie SQL → HTTP
Seção intitulada “4. Encadeie SQL → HTTP”Agora a mágica: use uma linha SQL como input pra um bloco HTTP. Adicione:
```http alias=user_detailGET https://httpbin.org/anything/users/{{users_list.row[0].id}}Accept: application/json
# expect:# status == 200# body.url contains "/users/1"```O que {{users_list.row[0].id}} faz:
| Parte | Significa |
|---|---|
users_list | o alias do bloco SQL acima |
row[0] | primeira linha do result set |
.id | coluna id daquela linha |
Aperte Cmd+Enter em user_detail. O httui:
- Vê a referência → roda
users_listprimeiro (já cacheado → instantâneo). - Substitui
1por{{users_list.row[0].id}}→ a URL vira.../users/1. - Manda a request e faz assert da response.
Você acabou de encadear uma query SQL numa request HTTP real. O mesmo pattern funciona ao contrário — use um valor de response HTTP como parâmetro SQL:
```db-localSELECT * FROM users WHERE id = {{user_detail.body.json.id}}```5. EXPLAIN ANALYZE (o bônus)
Seção intitulada “5. EXPLAIN ANALYZE (o bônus)”Adicione mais um bloco:
```db-localEXPLAIN QUERY PLANSELECT * FROM users WHERE id = 1```Aperte Cmd+Enter. SQLite retorna o plano; pra Postgres / MySQL
o mesmo bloco nesses drivers renderiza o EXPLAIN ANALYZE como
tree view com scans sequenciais lentos destacados em vermelho.
Botão-direito em qualquer nó pra “Copy as TEXT”.
Seu runbook agora tem o loop:
graph LR A[users_list - SQL] -- row[0].id --> B[user_detail - HTTP] B -- assert --> C[passa/falha]Commite. Abra o mesmo vault amanhã, aperte Run all e você vai saber em 500ms se o DB e a API ainda concordam.
E agora
Seção intitulada “E agora”- Referências entre blocos — sintaxe completa —
{{$prev}},{{headers.X}}, JSON paths, escopo - Conceitos → conexões + secrets —
troque
localpor um Postgres de verdade com senha no keychain do SO - Arquitetura — como a safety SQL + resolução de cadeia funcionam por baixo dos panos