Databas med Prisma och SQLite 💾
Modulsmål 🎯
Efter denna modul kan du:
- ✅ Installera och konfigurera Prisma med SQLite
- ✅ Definiera datamodeller med Prisma Schema
- ✅ Använda Prisma Client för CRUD operations
- ✅ Migrera från in-memory storage till riktig databas
- ✅ Hantera relationer mellan tabeller
Hittills har vi sparat data i arrays som försvinner när servern startar om. Nu lär vi oss att spara data permanent i en databas!
Vad är Prisma? 🤔
Prisma är en modern ORM (Object-Relational Mapping) som:
- Gör det enkelt att prata med databaser
- Ger dig type-safety automatiskt
- Hanterar migrations åt dig
- Fungerar med TypeScript out-of-the-box
SQLite är en:
- Liten, snabb databas som sparas som en fil
- Perfect för utveckling och små projekt
- Inget setup behövs - bara kör!
Projekt: Uppdatera din Forum-app 🔄
Vi ska ta din forum-app från förra modulen och byta ut array-storage mot en riktig databas!
Steg 1: Installera Prisma 🛠️
# I ditt forum-app projekt
npm install prisma @prisma/client
# Initiera Prisma med SQLite
npx prisma init --datasource-provider sqlite
Detta skapar:
prisma/
mapp medschema.prisma
.env
fil med databas-URL
Steg 2: Definiera din datamodell 📋
Öppna prisma/schema.prisma
och ersätt innehållet:
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "sqlite"
url = env("DATABASE_URL")
}
model Forum {
id String @id @default(uuid())
name String @unique
description String
createdAt DateTime @default(now())
// Hur skulle du lägga till messages här?
}
// Skapa en Message model här
// Tips: kolla dokumentet för exempel på relationer
Fyll i Message-modellen själv. Tänk på:
- Vilka fält behöver ett meddelande?
- Hur ska det kopplas till Forum?
- Kolla exemplet i dokumentet för inspiration!
Steg 3: Skapa databasen 🔨
# Detta skapar SQLite-filen och tabellerna
npx prisma db push
Grattis! Du har nu en riktig databas! 🎉
Steg 4: Konfigurera Prisma Client 🔧
Uppdatera src/lib/index.ts
:
// src/lib/index.ts
import { PrismaClient } from '@prisma/client';
export const prisma = new PrismaClient();
// Ta bort dina gamla array-baserade funktioner
// Vi använder Prisma direkt nu!
Steg 5: Uppdatera dina load functions 📝
I src/routes/forums/+page.server.ts
:
// src/routes/forums/+page.server.ts
import type { PageServerLoad, Actions } from './$types';
import { prisma } from '$lib';
import { fail } from '@sveltejs/kit';
export const load = (async () => {
// Hur skulle du hämta alla forum från databasen?
// Tips: prisma.forum.findMany()
}) satisfies PageServerLoad;
export const actions = {
create: async ({ request }) => {
const data = await request.formData();
const name = data.get('name')?.toString();
const description = data.get('description')?.toString();
// Validering här...
try {
// Hur skulle du skapa ett nytt forum?
// Tips: prisma.forum.create({ data: { ... } })
return { success: true };
} catch (error) {
// Vad händer om forum-namnet redan finns?
return fail(400, { error: 'Forum finns redan' });
}
}
} satisfies Actions;
Steg 6: Uppdatera dynamiska routes 🎯
I src/routes/forums/[forum]/+page.server.ts
:
import { prisma } from '$lib';
import { error } from '@sveltejs/kit';
export const load = (async ({ params }) => {
const forumName = params.forum;
// Hitta forumet OCH dess meddelanden
const forum = await prisma.forum.findUnique({
where: { name: forumName },
include: { /* Vad ska stå här? */ }
});
if (!forum) {
throw error(404, 'Forum hittades inte');
}
return {
forum,
messages: forum.messages // Om du inkluderade dem ovan
};
}) satisfies PageServerLoad;
export const actions = {
message: async ({ request, params }) => {
// Skapa nytt meddelande med Prisma
// Tips: använd connect för att koppla till forum
}
} satisfies Actions;
Viktiga Prisma-koncept 🧠
1. Grundläggande operationer
// Skapa
const newForum = await prisma.forum.create({
data: {
name: 'gaming',
description: 'Diskutera spel här!'
}
});
// Läsa
const allForums = await prisma.forum.findMany();
const oneForum = await prisma.forum.findUnique({
where: { id: 'some-uuid' }
});
// Uppdatera
const updated = await prisma.forum.update({
where: { id: 'some-uuid' },
data: { description: 'Ny beskrivning' }
});
// Ta bort
await prisma.forum.delete({
where: { id: 'some-uuid' }
});
2. Relationer och include
// Hämta forum MED dess meddelanden
const forumWithMessages = await prisma.forum.findUnique({
where: { name: 'gaming' },
include: { messages: true }
});
// Skapa meddelande kopplat till forum
await prisma.message.create({
data: {
content: 'Hej!',
author: 'SpelareBob',
forum: {
connect: { id: 'forum-uuid' }
}
}
});
3. Felhantering
try {
await prisma.forum.create({
data: { name: 'gaming' } // Redan finns
});
} catch (error) {
if (error.code === 'P2002') {
// Unique constraint violation
return fail(400, { error: 'Forum finns redan' });
}
throw error;
}
Uppgifter att lösa 📝
Grundnivå:
- Få grundfunktionaliteten att fungera
- Definiera Message-modellen korrekt
- Uppdatera alla load functions att använda Prisma
- Testa att skapa forum och meddelanden
Mellannivå:
- Lägg till mer funktionalitet
- Ta bort forum och meddelanden
- Redigera forum-beskrivningar
- Sök-funktionalitet
Expertnivå:
- Avancerade features
- Sortering av meddelanden (senaste först)
- Paginering för stora forum
- Statistik (antal meddelanden per forum)
Debugging och verktyg 🔧
Prisma Studio
# Öppna visuell databas-editor
npx prisma studio
Detta öppnar en webgränssnitt där du kan:
- Se all data i databasen
- Redigera data direkt
- Testa queries
Prisma generate
# Regenerera Prisma Client (kör efter schema-ändringar)
npx prisma generate
Database reset
# Återställ databasen (raderar all data!)
npx prisma db push --force-reset
Vanliga problem 🚨
❌ "Cannot find module '@prisma/client'"
Lösning: Kör npx prisma generate
❌ "Table 'Forum' doesn't exist"
Lösning: Kör npx prisma db push
❌ "Unique constraint failed"
Lösning: Du försöker skapa något som redan finns (t.ex. forum med samma namn)
❌ Types stämmer inte
Lösning: Kör npx prisma generate
efter schema-ändringar
❌ Du kan inte köra npx prisma generate
Lösning: Kör se till att utvecklingsservern är avstängd (CTRL+C i terminalfönstret du kört npm run dev
i)
❌ Servern kör inte längre
Lösning: Kör npm run dev
i korrekt mapp för att starta servern
Tips 💡
- Använd Prisma Studio för att se vad som händer i databasen
- Läs felmeddelanden - Prisma ger bra error messages
- Ändra
schema.prisma
- Kör
npx prisma db push
- Kör
npx prisma generate
- Uppdatera din kod
Nästa steg 🚀
Nu när du har en riktig databas, nästa modul handlar om relationer och mer avancerade dataoperationer. Vi ska bygga en marknadsplats där du verkligen får träna på komplexa relationer!
Resurser 📚
- Prisma Docs: prisma.io/docs
- Prisma Schema: prisma.io/docs/concepts/components/prisma-schema
- Prisma Studio: prisma.io/studio