En nybörjarguide till Prisma
I min senaste version av webbplatsen Tunes & Friends valde jag att använda mig av Prisma för att hantera min databas. I arbetet med detta lärde jag mig mycket värdefull information som jag nu valt att skriva ner, dels för att själv sortera min nya kunskap men också för att det kan vara en sjysst ingång för någon annan som vill börja använda Prisma. I guiden kommer jag hålla mig kring de mer grundläggande funktionerna och gå igenom vad Prisma är för någonting, schema/ models, datarelationer, Prisma client och grunderna i att skriva prismakod.
Vad är Prisma?
På Prismas webbplats skriver de att prisma är en “open source ORM (object-relational mapping) det innebär att vi med hjälp av Prisma kan hantera och interagera med vår databas. Vi kartlägger databasens struktur och relationer med hjälp av models inuti vårt schema. När det sedan är dags att prata med databasen använder man Prisma client, som gör hanterandet av databasfrågor smidigt och mycket enklare. Att skriva kod i både the schema och med the client är intuitivt och enkelt att förstå till skillnad från ett data modeling languae som man annars behöver hantera om man skall jobba med en databas.
Models / Schema
I ditt projekt kommer du (efter installationen av Prisma) ha en fil som heter prisma.schema, i den skriver man sina modeller. Här nedan har jag lagt in en bild på min User model, i den beskrivs all data som jag vill skall vara möjlig att spara ner till databasen.
Det här är en model:
En modell representerar en tabell i databasen och här definierar man vad för info som skall lagras i tabellen. Varje rad i modellen kallas för fält, och varje fält har fyra delar:
- Name — Vad fältet skall heta i databasen (representeras här i blått). Det är förstås bra om namnet representerar den data som skall lagras. Att ha ett namn på fältet är obligatoriskt.
- Type — Vad för datatyp som skall sparas i fältet (representeras här i röd/rosa) Att definiera datatyp är också obligatoriskt. Det finns många olika datatyper bl.a: Int, String, Boolean, Float och DateTime.
- Type modifier — Frågetecknen och [] är exempel på type modifiers, de är inte obligatoriska utan bara ett sätt att modifiera datan. Frågetecknet betyder att det inte måste sparas ett värde i vältet, man kan till exempel välja om man vill ange en profiltext eller stad på min webbplats. [] betyder att man kan spara flera värden som en array.
- Atributes —Representeras i bilden ovan med en orange färg och beskriver olika kännetecken för datan som skall sparas i fältet. Att något är ett attribut ser man genom att det börjar med ett @. Man kan specificera en mängd olika attribut här. Jag har till exempel valt att använda mig av saker som: default, unique och relation som innebär att fältet får ett defaultvärde, måste vara unikt eller att de hänger samman med ett annat fält i schemat.
Data relations
Normalt är data i en databas relaterad till annan data i samma databas, till exempel kan man i Tunes & Friends som användare välja att spara en låt — alltså en relation mellan User och Tune. Det finns tre olika typer av data relations som jag går igenom här nedan.
one to one — Det här är den enklaste formen av data relations, det kan till exempel vara att man sparar en användares preferens angående mailutskick. Man kan svara ja eller nej på frågan om man vill vara med på maillistan, men man behöver heller inte svara på frågan. Preferensen för mailutskick sparas i modellen userPreference och här nedan kan man se hur man gör för att koppla samman en modell med en annan när man skriver en one to one relation.
Man skulle även kunna ha ett fält i User-modellen där man sparar värdet som en boolean, men jag valde att göra på detta sättet för att visa det som ett exempel.
one to many relationships — Denna relationsform används på Tunes & Friends då en användare vill följa en annan användare. Varje “följning” sparas som en följare och en som blir följd, eftersom att jag enkelt vill kunna visa information om vem som följer en användare och och vilka en användare följer. Relationerna mellan användare sparas här i fälten “following” och “followedBy”, Prisma är smart och skapar en ny tabell i databasen som heter “follows”. I den tabellen sparas relationerna och man kan se vem som följer vem.
many to many — Det här är en av de mer komplicerade datarelationerna, men med Prisma blir det relativt enkelt för att prisma sköter mycket av det som är krångligt med en many to many relation automatiskt. Jag har använt en many to many relation i Tunes & Friends: Det finns många användare och det finns många låtar, och alla användare skall kunna spara flera låtar. Låtarna kommer från thesession.org, en fantastisk databas över irländska folkmusiklåtar. Jag har skapat en modell som sparar ner the sessions låt-id, och som sedan kopplar samma en användare med en låt.
Modellen Tune är sammankopplad med User modellen via Tune[] och User[] och detta gör att Prisma automatiskt skapar en ny databastabell för knowTunes och en för starredTunes. I respektive ny tabell sparas en användare och en låt, på det viset kopplas användare och låtar samman och en användare kan spara alla låtar den kan och även stjärnmarkera låtar.
enum —Det sista jag vill nämna här är enum. Det är ett sätt att skapa en form av modell för ett begränsat antal svarsalternativ. Det fungerar utmärkt att använda enum om man till exempel vill att användarna skall kunna ha olika roller med olika privilegier på webbplatsen. Föreställ dig att Tunes & Friends har blivit ett stort community, plötsligt behöver vi admins som rensar bland kommentarer. Då kan vi använda enum enligt följande:
En användare får automatiskt rollen “basic” när den registrerar sig, men man kan också ge användare privilegiet att vara admin. Sedan kan man i frontend skriva in funktioner som man bara kan komma åt om man har admin som enum här.
Prisma client
Vi har nu kommit till nästa del och det är dags att skriva kod med Prisma client. Prisma client autogenereras utifrån schemat och modellerna och innebär att det blir otroligt mycket enklare att hantera databasfrågor. Prisma client är typad utifrån modellerna i schemat och den hjälper oss med de metoder som finns inbyggt i prisma. Det måste installeras separat, det görs via the terminalen med kommandot nedan:
npm install @prisma/client
Efter att the client är installerad skall den genereras och det gör man med detta kommando:
npm run prisma:generate:local
Nu är Prisma client installerad och genererad, dags att använda funktionerna!
Vilken data vill vi komma åt och vad vill vi göra med den? — Här bör vi ställa oss två frågor:
- Skall vi skapa, läsa, updatera eller radera?
- Skall vi nå en eller flera användare?
Create (och createMany) — Används för att lägga till t.ex. en ny användare i databasen.
Read (findUnique, findMany, findFirst) — Att hitta information om en eller flera användare är grundläggande, här finns flera olika inbyggda funktioner för att hitta och visa data ifrån databasen.
Update (och updateMany) — Används för att updatera eller lägga till information i databasen.
Delete (och deleteMany) — Används för att radera t.ex. en användare från databasen.
Where and Data
where and data är två viktiga begrepp för att kunna hitta data och sedan göra någonting med datan i databasen.
Beroende på vilken metod man valt ovan, ta bort eller uppdatera så måste man på något sätt förmedla till databasen vart någonstans det skall hända. Det gör man genom “where” och sedan beskriva det särskiljande drag som man definierat i modellen. Om man vill hitta en specifik användare kan man använda användarens id, eftersom att det alltid kommer vara unikt för just den användaren.
Om man valt en metod som innebär att lägga till ny information i databasen så måste vi på något sätt skriva den information som skall sparas, det gör man genom “data”.
Såhär ser det ut när en ny användare skapas i min databas. Först så kollar jag om man kan hitta en användare med den givna mailadressen, om det finns så skickar jag en respons som säger att det redan finns en användare med den mailadressen. Om det inte finns går vi vidare ner i processen där vi med hjälp av metoden “create” skapar en ny användare och lägger till namn och email.
En konversation med databasen kan med hjälp av the client se ut såhär:
Slutligen
För mig har det varit roligt och relativt enkelt att ta mig an Prisma, dels för att det är ett språk som är mer intuitivt och dels för att dokumentationen har varit bra. Jag tycker om att databasen är så nära till hands och att prisma client är så hjälpsamt när man skriver databasfrågor.