Impulse AI Docs
Intern dokumentasjon
skipLink.label

Database-arbeidsflyt

Denne guiden dekker hele databasearbeidsflyten — fra oppretting av migrasjoner til deploy i staging og produksjon.

Impulse AI bruker Supabase (PostgreSQL) med migrasjoner i packages/database/supabase/migrations/. Typegenereringen produserer TypeScript-typer i packages/database/types/database.ts.

packages/database/
├── supabase/
│ ├── migrations/ # SQL-migrasjonsfiler (tidsstemplet)
│ ├── seed.sql # Testdata for lokal utvikling
│ └── config.toml # Supabase-konfigurasjon
├── types/
│ └── database.ts # Auto-genererte TypeScript-typer
└── package.json

Opprett ny migrasjon

heading.anchorLabel
Terminal window
# 1. Opprett migrasjonsfil
pnpm db:migrate:new navn_pa_migrasjonen
# Eksempel:
pnpm db:migrate:new add_check_in_source_field

Dette oppretter en tom SQL-fil i packages/database/supabase/migrations/ med tidsstempel-prefiks.

Skriv migrasjons-SQL

heading.anchorLabel

Rediger den nye filen i packages/database/supabase/migrations/:

-- Legg til ny kolonne
ALTER TABLE check_ins
ADD COLUMN IF NOT EXISTS source_impulse_id UUID REFERENCES impulses(id);
-- Opprett indeks
CREATE INDEX IF NOT EXISTS idx_check_ins_source_impulse
ON check_ins(source_impulse_id)
WHERE source_impulse_id IS NOT NULL;
Terminal window
# 1. Nullstill databasen (kjorer ALLE migrasjoner + seed)
pnpm db:reset
# 2. Verifiser med Supabase Studio
pnpm db:studio
# Apne http://localhost:54323

db:reset gjor folgende:

  1. Sletter og gjenoppretter lokal database
  2. Kjorer alle migrasjoner i rekkfolge
  3. Kjorer seed.sql for testdata
  4. Flusher Redis throttle-nokkler

Generer TypeScript-typer

heading.anchorLabel
Terminal window
# Generer typer fra gjeldende skjema
pnpm db:types
# Verifiser at typene er oppdatert
# Sjekk packages/database/types/database.ts

Andre nyttige kommandoer

heading.anchorLabel
KommandoBeskrivelse
pnpm db:statusSjekk databasestatus
pnpm db:studioApne Supabase Studio (port 54323)
pnpm db:diffSammenlign lokal database vs migrasjoner
pnpm db:seedKjor seed-data pa nytt
pnpm db:pullHent skjema fra remote
pnpm db:pushPush skjema til remote

Deploy til staging

heading.anchorLabel

Database-migrasjoner deployes automatisk til staging ved push til main.

CI-workflowen (ci.yml) detekterer endringer i packages/database/ og kjorer:

  1. Supabase CLI kobler til staging-prosjektet
  2. Kjorer ventende migrasjoner
  3. Rapporterer resultat
Terminal window
# Sjekk deploy-status
gh run list --branch main --limit 3

Deploy til produksjon

heading.anchorLabel

Database-migrasjoner deployes automatisk til produksjon ved opprettelse av git tag:

Terminal window
# Opprett versjon-tag
git tag v1.2.3
git push --tags

deploy-production.yml-workflowen:

  1. Henter hemmeligheter fra Doppler (produksjon)
  2. Kobler Supabase CLI til produksjonsprosjektet
  3. Kjorer ventende migrasjoner
  4. Rapporterer resultat

Manuell deploy (fallback)

heading.anchorLabel

Hvis automatisk deploy feiler, bruk manuell workflow:

Terminal window
# Dry-run mot staging (forhandsvisning)
gh workflow run db-deploy.yml \
-f environment=staging \
-f action=dry-run
# Faktisk migrasjon mot staging
gh workflow run db-deploy.yml \
-f environment=staging \
-f action=migrate
# Faktisk migrasjon mot produksjon
gh workflow run db-deploy.yml \
-f environment=production \
-f action=migrate

Best practices

heading.anchorLabel

Bruk alltid defensive SQL-konstruksjoner:

-- Kolonner
ALTER TABLE foo ADD COLUMN IF NOT EXISTS bar TEXT;
-- Tabeller
CREATE TABLE IF NOT EXISTS baz (
id UUID PRIMARY KEY DEFAULT gen_random_uuid()
);
-- Indekser
CREATE INDEX IF NOT EXISTS idx_foo_bar ON foo(bar);
-- Funksjoner
CREATE OR REPLACE FUNCTION my_function() ...

Datamigrasjoner

heading.anchorLabel

Separere skjemaendringer fra datamigrasjoner:

-- 1. Legg til ny kolonne (skjema)
ALTER TABLE impulses ADD COLUMN IF NOT EXISTS source TEXT;
-- 2. Migrer data (kun for eksisterende rader)
UPDATE impulses SET source = 'manual' WHERE source IS NULL;
-- 3. Sett NOT NULL etter migrasjonen
ALTER TABLE impulses ALTER COLUMN source SET NOT NULL;

Destruktive operasjoner

heading.anchorLabel

Vurder konsekvenser for du sletter kolonner eller tabeller:

-- Steg 1 (denne releasen): Slutt a skrive til kolonnen i koden
-- Steg 2 (neste release): Fjern kolonnen
ALTER TABLE sessions DROP COLUMN IF EXISTS legacy_status;

Komplett arbeidsflyt

heading.anchorLabel
Terminal window
# 1. Opprett migrasjon
pnpm db:migrate:new din_endring
# 2. Skriv SQL
# (rediger filen i packages/database/supabase/migrations/)
# 3. Test lokalt
pnpm db:reset
# 4. Generer typer
pnpm db:types
# 5. Verifiser typene kompilerer
pnpm type-check
# 6. Commit og push
git add packages/database/
git commit -m "feat(db): add check-in source field"
git push

Migrasjonen feiler lokalt

heading.anchorLabel
Terminal window
# Se feilmelding
pnpm db:reset 2>&1 | tail -20
# Fiks SQL-filen og kjor pa nytt
pnpm db:reset

Typegenereringen feiler

heading.anchorLabel
Terminal window
# Sjekk at databasen kjorer
pnpm db:status
# Restart Supabase
pnpm db:restart
# Kjor typer pa nytt
pnpm db:types

Migrasjoner ut av synk

heading.anchorLabel
Terminal window
# Se lokal vs remote migrasjonsstatus
pnpm db:diff
# Nullstill og start pa nytt
pnpm db:reset