Skip to content

feat: adiciona Drizzle ORM + Postgres via Hyperdrive - #169

Open
iacapuca wants to merge 1 commit into
mainfrom
feat/drizzle-postgres
Open

feat: adiciona Drizzle ORM + Postgres via Hyperdrive#169
iacapuca wants to merge 1 commit into
mainfrom
feat/drizzle-postgres

Conversation

@iacapuca

@iacapuca iacapuca commented Aug 5, 2026

Copy link
Copy Markdown
Collaborator

Base para desenvolver features com banco. Não altera nenhuma rota, query ou componente existente — o seam é dentro dos handlers createServerFn em app/queries/, então trocar um cmsFetch() por um db.select() não mexe em rota, query key nem componente.

O que entra

arquivo o quê
app/lib/db.server.ts helper withDb(), espelha app/lib/strapi.ts
app/db/schema.ts módulo de tabelas (vazio, aguarda a primeira)
drizzle.config.ts config do drizzle-kit
docker-compose.yml Postgres 18 para dev local
worker-configuration.d.ts gerado por wrangler types

Scripts: db:generate, db:migrate, db:studio.

Duas conexões para o mesmo banco

É o ponto que costuma quebrar:

caminho quem usa como
binding Hyperdrive o Worker, em runtime pool quente perto do banco
DATABASE_URL drizzle-kit, máquina/CI conexão direta

O drizzle-kit não consegue discar um binding do Workers — daí as duas.

Hyperdrive em vez de conexão direta porque cada invocação do Worker abriria TCP+TLS+auth até o Azure (~7 round-trips), e o Workers limita 6 conexões concorrentes por invocação. placement: smart acompanha, já que os handlers fazem Promise.all de várias chamadas.

O typecheck sobe de 282 para 554

Os runtime types do Workers tipam Response.json() como unknown em vez do any do DOM, o que expõe 272 erros pré-existentes de .json() consumido sem validação — PointInfoPopup.tsx concentra 251.

São latentes, não regressão: o typecheck já era informativo e já falhava com 282. O padrão para pagar essa dívida já existe no repo, nas queries migradas pro Strapi com Zod.

db.server.ts, db/schema.ts e o build passam limpos.

Verificado

  • db:generatedb:migrate contra Postgres 18.4 real, tabela criada com os tipos certos
  • build passa com a camada de banco importada
  • PG18 mudou o PGDATA para /var/lib/postgresql/18/docker; o volume monta o pai, senão o banco não persiste
  • porta 5433 no host (a 5432 costuma estar ocupada por outro projeto)

Não verificado: o caminho Hyperdrive em runtime, porque depende dos IDs que ainda não existem.

Antes de mergear

Criar os dois Hyperdrive e substituir os REPLACE_WITH_*_HYPERDRIVE_ID no wrangler.jsonc:

pnpm wrangler hyperdrive create ameciclo-prod    --connection-string="postgres://...?sslmode=require"
pnpm wrangler hyperdrive create ameciclo-staging --connection-string="postgres://...?sslmode=require"

E liberar os IPs de egress da Cloudflare no firewall do Azure — o Hyperdrive conecta da rede da Cloudflare, e Allow Azure services não cobre isso.

Vale também considerar wrangler types --check na CI, para falhar se alguém mexer no wrangler.jsonc sem regenerar os tipos.

🤖 Generated with Claude Code

Base para desenvolver features com banco. Nao altera nenhuma rota, query
ou componente existente.

- app/lib/db.server.ts: helper withDb(), espelha app/lib/strapi.ts
- app/db/schema.ts: modulo de tabelas (vazio, aguarda a primeira)
- drizzle.config.ts + scripts db:generate / db:migrate / db:studio
- docker-compose.yml: Postgres 18 para dev local
- wrangler.jsonc: binding Hyperdrive (prod + staging) e placement smart
- tsconfig: worker-configuration.d.ts gerado por `wrangler types`

Duas conexoes distintas para o mesmo banco: o Worker usa o binding
Hyperdrive em runtime; o drizzle-kit usa DATABASE_URL direto para
migrations, porque nao consegue discar um binding do Workers.

Os runtime types do Workers tipam Response.json() como unknown em vez do
any do DOM, o que expoe 272 erros pre-existentes de .json() sem validacao
(282 -> 554 no typecheck, que ja era informativo). Sao latentes, nao
regressao — o padrao para paga-los ja existe nas queries com Zod.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NzvzBUT8kw8SbR4bsGab97
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant