Łączenie z bazą danych
W poprzedniej części omówiłem, czym są komponenty serwerowe i jak możemy dzięki nim wyeliminować backend. Wprowadziłem też kolejną paczkę o nazwie Prisma, którą teraz omówię trochę dokładniej.
Czym jest Prisma?
Prisma to ORM (Object-Relational Mapper), który pozwala na łatwe łączenie się z bazą danych. Prisma pozwala na tworzenie zapytań do bazy danych w języku TypeScript, co jest dużym ułatwieniem, jeżeli piszesz w Next.js, a dzięki temu przy okazji jest odporna na SQL injection. Prisma obsługuje wiele baz danych, takich jak PostgreSQL, MySQL, SQLite, czy SQL Server. Ja osobiście korzystam z MySQL i na jego przykłądzie będę przedstawiał przykłady, chociaż sama składnia zapytań się nie zmienia.
Jak zacząć korzystać z Prisma?
-
Zainstaluj paczkę w swoim projekcie:
Okno terminala npm install prisma -
Zainicjalizuj Prisma w swoim projekcie:
Okno terminala npx prisma initPo wykonaniu tej komendy zostanie utworzony folder
prisma
w twoim projekcie, w którym znajdziesz plikschema.prisma
. W tym pliku definiujesz strukturę tabel w twojej bazie danych. Poza tym powstanie plik .env (jeśli już nie istnieje) w roocie twojego projektu, w którym będziesz mógł zdefiniować adres do połączenia z twoją bazą. -
Zdefiniuj połączenie z bazą danych w pliku
schema.prisma
:datasource db {provider = "mysql"url = env("DATABASE_URL")} -
Zdefiniuj adres połączenia z lokalną bazą danych w pliku
.env
:DATABASE_URL="mysql://user:password@server_address:3306/database_name"Adresem może też być adres bazy hostowanej w chmurze, np. Postgress z NeonDB.
-
Dodaj swoje tabele:
model User {id Int @id @default(autoincrement())name Stringemail String @uniqueposts Post[]}model Post {id Int @id @default(autoincrement())title Stringcontent String?author User? @relation(fields: [authorId], references: [id])authorId Int?}Prisma ma swój własny język używany do definiowania schematów tabel w bazie danych. W powyższym przykładzie definiujemy dwie tabele:
User
iPost
. TabelaUser
ma polaid
,name
,email
i relację z tabeląPost
. TabelaPost
ma polaid
,title
,content
, relację z tabeląUser
i poleauthorId
, które jest kluczem obcym do tabeliUser
. -
Wygeneruj klienta Prismy:
Okno terminala npx prisma generatePo wykonaniu tej komendy zostanie wygenerowany klient Prisma, który pozwoli na wykonywanie zapytań do bazy danych. Przy pierwszej generacji klienta Prisma będzie chciała doinstalować paczkę
@prisma/client
, jeśli sam już tego nie zrobiłeś. -
Zdefiniuj globalną instancję klienta Prismy w swoim projekcie. Jest to potrzebne głównie po to, żeby na produkcji nie tworzyć osobnego klienta dla każdego zapytania. Jak możesz się domyślić, każdy klient zżera zasoby, więc warto zainicjalizować go raz i używać jednego klienta na sesję:
import { PrismaClient } from "@prisma/client";const globalForPrisma = global as unknown as {prisma: PrismaClient | undefined;};export const prisma = globalForPrisma.prisma ?? new PrismaClient();if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = prisma;