Database-arbeidsflyt
Denne guiden dekker hele databasearbeidsflyten — fra oppretting av migrasjoner til deploy i staging og produksjon.
Oversikt
heading.anchorLabelImpulse 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.jsonOpprett ny migrasjon
heading.anchorLabel# 1. Opprett migrasjonsfilpnpm db:migrate:new navn_pa_migrasjonen
# Eksempel:pnpm db:migrate:new add_check_in_source_fieldDette oppretter en tom SQL-fil i packages/database/supabase/migrations/ med tidsstempel-prefiks.
Skriv migrasjons-SQL
heading.anchorLabelRediger den nye filen i packages/database/supabase/migrations/:
-- Legg til ny kolonneALTER TABLE check_insADD COLUMN IF NOT EXISTS source_impulse_id UUID REFERENCES impulses(id);
-- Opprett indeksCREATE INDEX IF NOT EXISTS idx_check_ins_source_impulseON check_ins(source_impulse_id)WHERE source_impulse_id IS NOT NULL;Test lokalt
heading.anchorLabel# 1. Nullstill databasen (kjorer ALLE migrasjoner + seed)pnpm db:reset
# 2. Verifiser med Supabase Studiopnpm db:studio# Apne http://localhost:54323db:reset gjor folgende:
- Sletter og gjenoppretter lokal database
- Kjorer alle migrasjoner i rekkfolge
- Kjorer
seed.sqlfor testdata - Flusher Redis throttle-nokkler
Generer TypeScript-typer
heading.anchorLabel# Generer typer fra gjeldende skjemapnpm db:types
# Verifiser at typene er oppdatert# Sjekk packages/database/types/database.tsAndre nyttige kommandoer
heading.anchorLabel| Kommando | Beskrivelse |
|---|---|
pnpm db:status | Sjekk databasestatus |
pnpm db:studio | Apne Supabase Studio (port 54323) |
pnpm db:diff | Sammenlign lokal database vs migrasjoner |
pnpm db:seed | Kjor seed-data pa nytt |
pnpm db:pull | Hent skjema fra remote |
pnpm db:push | Push skjema til remote |
Deploy til staging
heading.anchorLabelDatabase-migrasjoner deployes automatisk til staging ved push til main.
CI-workflowen (ci.yml) detekterer endringer i packages/database/ og kjorer:
- Supabase CLI kobler til staging-prosjektet
- Kjorer ventende migrasjoner
- Rapporterer resultat
# Sjekk deploy-statusgh run list --branch main --limit 3Deploy til produksjon
heading.anchorLabelDatabase-migrasjoner deployes automatisk til produksjon ved opprettelse av git tag:
# Opprett versjon-taggit tag v1.2.3git push --tagsdeploy-production.yml-workflowen:
- Henter hemmeligheter fra Doppler (produksjon)
- Kobler Supabase CLI til produksjonsprosjektet
- Kjorer ventende migrasjoner
- Rapporterer resultat
Manuell deploy (fallback)
heading.anchorLabelHvis automatisk deploy feiler, bruk manuell workflow:
# Dry-run mot staging (forhandsvisning)gh workflow run db-deploy.yml \ -f environment=staging \ -f action=dry-run
# Faktisk migrasjon mot staginggh workflow run db-deploy.yml \ -f environment=staging \ -f action=migrate
# Faktisk migrasjon mot produksjongh workflow run db-deploy.yml \ -f environment=production \ -f action=migrateBest practices
heading.anchorLabelIdempotens
heading.anchorLabelBruk alltid defensive SQL-konstruksjoner:
-- KolonnerALTER TABLE foo ADD COLUMN IF NOT EXISTS bar TEXT;
-- TabellerCREATE TABLE IF NOT EXISTS baz ( id UUID PRIMARY KEY DEFAULT gen_random_uuid());
-- IndekserCREATE INDEX IF NOT EXISTS idx_foo_bar ON foo(bar);
-- FunksjonerCREATE OR REPLACE FUNCTION my_function() ...Datamigrasjoner
heading.anchorLabelSeparere 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 migrasjonenALTER TABLE impulses ALTER COLUMN source SET NOT NULL;Destruktive operasjoner
heading.anchorLabelVurder konsekvenser for du sletter kolonner eller tabeller:
-- Steg 1 (denne releasen): Slutt a skrive til kolonnen i koden-- Steg 2 (neste release): Fjern kolonnenALTER TABLE sessions DROP COLUMN IF EXISTS legacy_status;Komplett arbeidsflyt
heading.anchorLabel# 1. Opprett migrasjonpnpm db:migrate:new din_endring
# 2. Skriv SQL# (rediger filen i packages/database/supabase/migrations/)
# 3. Test lokaltpnpm db:reset
# 4. Generer typerpnpm db:types
# 5. Verifiser typene kompilererpnpm type-check
# 6. Commit og pushgit add packages/database/git commit -m "feat(db): add check-in source field"git pushFeilsoking
heading.anchorLabelMigrasjonen feiler lokalt
heading.anchorLabel# Se feilmeldingpnpm db:reset 2>&1 | tail -20
# Fiks SQL-filen og kjor pa nyttpnpm db:resetTypegenereringen feiler
heading.anchorLabel# Sjekk at databasen kjorerpnpm db:status
# Restart Supabasepnpm db:restart
# Kjor typer pa nyttpnpm db:typesMigrasjoner ut av synk
heading.anchorLabel# Se lokal vs remote migrasjonsstatuspnpm db:diff
# Nullstill og start pa nyttpnpm db:reset