Prisma jest biblioteką, która ułatwia pracę z bazą danych. Do podstawowych operacji na bazie danych należy tzw.: CRUD - create, read, update i delete. W poście pokazuję, jak wyglądają takie operacje w Prisma i Fastify.
Na YouTube dodałem film, gdzie pokazuję krok po kroku, jak tworzę takiego CRUD’a. Jeśli wolisz tę formę, to zapraszam. Nie zapomnij polubić film i zasubskrybować.
youtube: https://youtu.be/Ya7WJwvlTxE
Na tym etapie zakładam, że masz utworzony projekt Fastify (lub dowolną inną biblioteką backendową). Prisma najprościej jest skonfigurować przy pomocy polecenia:
npx prisma init
Powoduje to powstanie:
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
Jest to nic innego jak oznaczenie, że korzystamy z klienta js i z bazy danych postgressql. Inne bazy danych, z jakich możesz skorzystać to:
Pełną listę wspieranych wersji znajdziesz tutaj: Wspierane bazy danych w Prisma.
To, co musisz zrobić to stworzyć model, na którym będziesz pracować. Poniżej daję przykład, ale możesz stworzyć własny według uznania.
model Post {
id Int @unique @default(autoincrement())
title String
content String
}
Krótkie wyjaśnienie co tu się dzieje. Int
oraz String
to typy pól, jakie będą w bazie danych. Dużo ciekawsze są atrybuty @unique
i @default
. Dodają one specjalne zachowanie do kolumn w bazie danych.
@unique
- wartości w kolumnie muszą być unikalne@default(autoincrement())
- ta kolumna ma wartości domyślne w postaci kolejnych liczb.Twoje zmiany są lokalne dopóki nie zrobisz migracji
Migracja to jest operacja, która przekształca obcy schemat bazy danych do nowej postaci. Będziesz ją wykonywał za każdym razem, gdy zmienisz coś w modelu. Aby wygenerować migrację i przesłać do bazy danych wpisz komendę:
npx prisma migrate dev
Utworzy to plik migracji oraz zastosuje migrację na bazę danych, z którą jesteś połączony (o ile dobrze wypełniłeś plik .env). Spowoduje to też wygenerowanie klienta, którego będziemy używać w następnych krokach.
Tutaj jest krótki kawałek kodu:
const { PrismaClient } = require('@prisma/client')
const prisma = new PrismaClient();
Tyle wystarczy, by korzystać z Prisma w kodzie.
fastify.post('/post', async(request) =>{
return prisma.post.create({data: request.body})
})
Bardzo prosta operacja, która stworzy nowy wiersz w tabeli Post. Co tu się dzieje?
Przykładowy obiekt, który trzeba wysłać jako body
{
"title": "test",
"content": "kontent"
}
I gotowy CURL
curl --request POST \
--url http://localhost:3000/post \
--header 'Content-Type: application/json' \
--data '{
"title": "test",
"content": "kontent"
}'
fastify.get('/post', async()=>{
return prisma.post.findMany();
})
fastify.get('/post/:id', async(request)=>{
return prisma.post.findUnique({
where:{
id: Number(request.params.id)
}
});
})
Jedna z najczęściej wykorzystywanych operacji. W Prisma możemy dane pobierać na 3 różne sposoby:
Domyślnie parametry zapytania są typu String, a moje ID w bazie istnieje jako Int i dlatego konieczna była konwersja.
I curle do testowania
curl --request GET \
--url http://localhost:3000/post/4
curl --request GET \
--url http://localhost:3000/post
fastify.put('/post/:id', async (request, reply)=>{
return prisma.post.update({
where:{
id: Number(request.params.id)
},
data: request.body
})
})
Zgodnie z REST mamy tutaj operację PUT. Operacja Update jest bardzo podobna do create i read.
Jeśli przeanalizujesz kod, to zauważysz, że mamy tu sekcję związaną z pobraniem pojedynczego kodu (zerknij do findUnique wyżej) i tworzenia nowych obiektów.
Podobnie jak w przypadku Create dostaniemy w odpowiedzi zmodyfikowany obiekt.
fastify.delete('/post/:id', async (request, reply)=>{
return prisma.post.delete({
where:{
id: Number(request.params.id)
}
})
})
Na sam koniec operacja usuwania pojedynczego obiektu. Zgodnie z REST do takiej operacji służy delete
. Podobnie jak przy operacji Update, tutaj też widać podobieństwa do findUnique.
Jako rezultat otrzymamy skasowany obiekt. Jeśli obiekt nie zostanie znaleziony, to w odpowiedzi będzie null.
Co sądzisz o tej bibliotece? Bardzo mi się spodobała i będę z niej korzystał więcej. Daj znać co o tym myślisz na Facebook/Instagram/Twitter.