Ga terug

Vijf redenen waarom wij van Prisma ORM houden

Voor het query'en van een database vanuit een website of web platform gebruiken we Prisma. Een greep uit de voordelen die dit biedt ten opzichte van een rechtstreekse database connectie lees je hier.

prisma.io

Prisma ORM is een open-source query-builder voor Node.js. Het bestaat uit drie delen: Prisma Client voor het bevragen van relationele databases, een migratietool genaamd Prisma Migrate, en Prisma Studio, een grafische gebruikersinterface voor het bekijken en bewerken van gegevens.

Lees hieronder de vijf redenen waarom wij Prisma gebruiken in onze projecten.

Typescript ondersteuning

We gebruiken Typescript al enkele jaren in al onze projecten. Door onze code te typen, verkleinen we de kans op fouten, omdat het binnen de editor wordt gecontroleerd terwijl we coderen. Het vult code ook automatisch aan tijdens het typen.

Het opvragen van gegevens is nu ook typeveilig omdat Prisma automatisch types genereert op basis van het databaseschema. Er is geen handmatige update van geassocieerde types nodig, zelfs niet wanneer het schema verandert, omdat Prisma hier automatisch voor zorgt. Deze combinatie van Prisma en Typescript past uitstekend bij onze huidige technologiestack en manier van werken.

Abstractie van database-specifieke details

Toen een van onze klanten ons vroeg om hun website opnieuw te ontwerpen, hebben we van de gelegenheid gebruik gemaakt om de hele site opnieuw te schrijven in Next.js. Hoewel de oorspronkelijke code in PHP en puur JavaScript was geschreven, gebruikte een latere toevoeging al Next.js. Twee afzonderlijke applicaties, elk met een eigen database, respectievelijk MySQL en SQLite. Daarom besloten we deze samen te voegen en alle gegevens in één MySQL-database te verplaatsen. Gelukkig gebruikten we al Prisma ORM om de gegevens op te halen, waardoor de database-migratie een fluitje van een cent was.

Relationele databases en RDBMS'en worden veel gebruikt voor gegevensopslag en -beheer. Het is dan ook geen verrassing dat er een breed scala aan implementaties is ontstaan. Verschillen in implementatie zijn te zien op vlak van datatypen, functies, syntax, enzovoort. Ondanks dat SQL wordt beschouwd als de standaard query-taal voor relationele databases, heeft elke databaseleverancier zijn eigen taaltje ontwikkeld. Je kunt ze beschouwen als dialecten van dezelfde taal. In MySQL is bijvoorbeeld de functie om de huidige datum te krijgen CURDATE(), terwijl het in SQLite DATE('now') is.

Gelukkig hoeven we bij het configureren van ons databaseschema met Prisma ORM geen rekening te houden met deze verschillen. Elke specifieke implementatie of taalvariant wordt automatisch voor ons verzorgd. Hierdoor kunnen we gegevens opvragen zonder rekening te houden met de specifieke details van de database. Dit is een aanzienlijk voordeel wanneer we met veel klanten aan verschillende projecten werken en dagelijks gegevens ophalen uit verschillende databases.

In dit geval stelde het ons in staat om niet alleen tussen databases, maar ook tussen databasesuppliers te schakelen zonder dat we functies of code voor het ophalen van gegevens hoefden te herschrijven. Het was gewoon een kwestie van de vorige gegevensbron vervangen door de nieuwe en @map-attributen toevoegen. Deze laatste stap is alleen nodig als je underscores wilt gebruiken bij het benoemen van databasekolommen.

schema.prisma
generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "mysql"
  url      = env("DATABASE_URL")
}

model Result {
  id                  Int      @id @default(autoincrement())
  date                DateTime
  discipline          String
  member              String
  score               Float?
  timeInt             Int?     @map(name: "time_int")
  category            String
  isIndoor            Boolean  @map(name: "is_indoor")
  year                Int
  gender              String

  @@index([year])
  @@map(name: "result")
}

Databasemigratie vanuit VS Code

Klanten hebben meestal een duidelijk idee van wat ze willen bereiken en waar ze de komende weken en maanden naartoe willen als ze een nieuwe website lanceren. Naarmate organisaties en technologieën evolueren, zullen ook hun digitale en data-eisen veranderen. We worden regelmatig gevraagd om verbeteringen aan te brengen en nieuwe functies aan bestaande projecten toe te voegen. In sommige gevallen kunnen hiervoor ook wijzigingen in de database nodig zijn.

Zoals eerder vermeld, heeft Prisma ons gedekt als het gaat om het wisselen van database. Met Prisma Migrate kunnen we ook snel de tabellen en kolommen wijzigen zonder onze code-editor te verlaten. Het is niet nodig om SQL-commando's te schrijven en uit te voeren. Bewerk eenvoudig het databaseschema en voer prisma migrate dev uit in de terminal.

Wanneer we klaar zijn met onze wijzigingen, pushen we onze code samen met het bijgewerkte schema. En omdat we code-wijzigingen al automatisch naar alle omgevingen doorvoeren, worden de noodzakelijke migraties tegelijkertijd uitgevoerd door prisma migrate deploy uit te voeren.

Filteren, sorteren en pagineren

Voor deze use-case hadden we een manier nodig om het beste resultaat voor elk lid op te halen uit meer dan 900.000 records. Deze resultaten moeten ook nog worden gefilterd, gepagineerd en gerangschikt van beste naar slechtste. Met de Prisma Client kunnen we dit allemaal realiseren, we hoeven deze functionaliteiten dus niet zelf te ontwikkelen. Dit is de resulterende query:

results.ts
import {NextApiRequest, NextApiResponse} from 'next'

import prisma from '../../database/prisma'

export default async function handler(
	req: NextApiRequest,
	res: NextApiResponse
) {
	const {filters, page, resultsPerPage} = req.body
	const filterConditions = Object.keys(filters).reduce((prev, curr) => {
		return {...prev, [curr]: {equals: filters[curr]}}
	}, {})

	const results = await prisma.result.findMany({
		distinct: ['member'],
		skip: ((page && page - 1) || 0) * resultsPerPage,
		take: resultsPerPage,
		where: {
			OR: [{score: {not: 0}}, {timeInt: {not: 0}}],
			...filterConditions
		},
		orderBy: [
			{score: 'desc'},
			{timeInt: 'asc'},
			{date: 'asc'}
		]
	})
	res.status(200).json(results)
}

Open source

Prisma ORM is open source, hoewel een privébedrijf het actief onderhoudt. Hierdoor zijn zowel Prisma Client als Migrate gratis te gebruiken. Het is ook goed gedocumenteerd en wordt het ondersteund door een groeiende community.

Samenvatting

Vooral de Typescript ondersteuning van Prisma biedt een grote meerwaarde. Ten allen tijde weten welke data je kan verwachten zorgt voor veel gemoedsrust tijdens het ontwikkelen. We gebruiken Typescript ondertussen in al onze projecten. Dat tools als Prisma dit ook ondersteunen, stelt ons in staat onze manier van werken verder door te trekken. Voor de volledigheid, een nadeel van het gebruik van Prisma is dat je een andere (query)taal moet leren. Maar dat is slechts een kleine kanttekening tegenover de vele voordelen dat het met zich meebrengt.

Advies of hulp nodig bij het ontwikkelen van een website of web platform? We helpen je graag verder.

Contacteer ons