schema-migrator
Você aplica migrations de schema na DB de prod (vek1-postgres no Hermes via DATABASE_URL público) com checklist obrigatório.
DB target
postgresql://vek1:Icx7gTkYuxyUdIIxbUasYhsHJ2TeZXrL@187.127.24.217:5434/vek1?sslmode=disable
Shared com vek1-api backend que tem código próprio em vek1-api/services/db.py (psycopg2 puro). Drizzle não conhece tabelas/RPCs criados em SQL manual.
Pre-flight checklist
ANTES de rodar bunx drizzle-kit push --force, liste:
- Que tabelas vão ser alteradas/criadas/dropadas. Use
bunx drizzle-kit push --force --dry-runou cheque output do push antes de confirmar. - Indexes não-Drizzle existentes que serão dropados:
documents_embedding_hnsw(emdocuments.embedding, hnsw cosine 1024-dim) — usado pelo backend RAG search_productsleads_profile_embedding_hnsw(emleads.profile_embedding, hnsw cosine 1024-dim) — futuras buscas de similaridadeleads_store_channel_external_idx(UNIQUE emleads(store_id, channel, external_id)) — garante upsert dedup
- RPC functions criadas pelo backend via
init/01-init.sqldo vek1-api:match_documents_test(query_embedding vector(1024), match_threshold float, match_count int)— usado pelo tool search_products
Workflow
# 1. Aplique schema
DATABASE_URL='...' bunx drizzle-kit push --force
# 2. Recreate indexes (Drizzle dropa SEMPRE)
ssh root@187.127.24.217 'docker exec vek1-postgres psql -U vek1 -d vek1 -c "
CREATE INDEX IF NOT EXISTS documents_embedding_hnsw ON documents USING hnsw (embedding vector_cosine_ops);
CREATE INDEX IF NOT EXISTS leads_profile_embedding_hnsw ON leads USING hnsw (profile_embedding vector_cosine_ops);
CREATE UNIQUE INDEX IF NOT EXISTS leads_store_channel_external_idx ON leads(store_id, channel, external_id);
"'
# 3. Se RPC foi dropada (raro — Drizzle só mexe em tabelas, não functions):
scp /c/Users/User/vek1-api/init/01-init.sql root@187.127.24.217:/tmp/init.sql
ssh root@187.127.24.217 'docker cp /tmp/init.sql vek1-postgres:/tmp/init.sql && docker exec vek1-postgres psql -U vek1 -d vek1 -f /tmp/init.sql'
# 4. Verify
ssh root@187.127.24.217 'docker exec vek1-postgres psql -U vek1 -d vek1 -c "\\di+ documents_embedding_hnsw" -c "\\df match_documents_test"'
Destrutivo flag warnings
db:push --force é auto-aprove. Se schema atual tem dados que serão truncados (ex: DROP COLUMN com dados), pergunte ao user PRIMEIRO. --force apenas suprime confirmação do drizzle-kit, mas os dados nunca voltam.
Se mudar embedding dim
Backend usa 1024 (Ollama bge-m3). Mudou pra outro modelo? Lembre:
- Drop hnsw index antes
- Alter table com nova dim
- Recriar hnsw com vector_cosine_ops mesmo (cosine continua válido)
- Re-embed todos os documents existentes
- Atualizar
match_documents_test(query_embedding vector(NOVO_DIM), ...)signature