Database
 sql >> Datenbank >  >> RDS >> Database

So verwenden Sie Prisma

Prisma ist ein interessantes ORM.

Ein ORM ist eine Abstraktionsschicht über einer Datenbank.

Ich hatte das Vergnügen, Prisma in den letzten Monaten in einigen verschiedenen Projekten einzusetzen, und hier möchte ich Ihnen zeigen, wie einfach es ist, loszulegen (und weiterzumachen).

Ich werde Prisma in einer React-Anwendung basierend auf Next.js verwenden.

Sie können mit

eine neue Next.js-App in einem Ordner erstellen
npx create-next-app

Das erste, was Sie tun müssen, um Prisma hinzuzufügen, ist, prisma einzuschließen in Ihren Entwicklungsabhängigkeiten:

npm install -D prisma

Jetzt haben Sie über npx Zugriff auf das Prisma-CLI-Dienstprogramm . Versuchen Sie Folgendes auszuführen:

npx prisma

und Sie sehen die Anweisungen zur Verwendung.

Führen Sie nun Folgendes aus, um Prisma für Ihr Projekt einzurichten:

npx prisma init

Dadurch wird ein prisma erstellt Ordner und darin eine schema.prisma Datei:

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

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

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

Es hat auch eine .env erstellt Datei, falls Sie noch keine haben, mit der DATABASE_URL Umgebungsvariable:

DATABASE_URL="postgresql://johndoe:randompassword@localhost:5432/mydb?schema=public"

Dieser muss auf Ihre Datenbank zeigen.

Lassen Sie uns diesen Punkt zuerst aus dem Weg räumen. Prisma unterstützt viele verschiedene Arten von (relationalen) Datenbanken. Ich habe es mit PostgreSQL und SQLite verwendet, aber es unterstützt auch MySQL, AWS Aurora, MariaDB.

In der Produktion verwende ich gerne die verwaltete Datenbank von DigitalOcean (obligatorischer Empfehlungslink für ein kostenloses Guthaben von 100 $ hier), aber für eine schnelle Beispiel-App ist Railway.app eine coole und kostenlose Wahl.

Nachdem Sie sich angemeldet haben, können Sie mit einem Klick eine PostgreSQL-Datenbank bereitstellen:

und unmittelbar danach erhalten Sie die Verbindungs-URL:

Kopieren Sie das in Ihre .env Datei als DATABASE_URL Wert.

Jetzt ist es an der Zeit, dem Schema ein Modell hinzuzufügen, das in eine Datenbanktabelle übersetzt wird.

Beachten Sie, dass Sie auch das Gegenteil tun können, wenn Sie eine Datenbank bereits mit Tabellen gefüllt haben, indem Sie npx prisma introspect ausführen . Prisma generiert das Schema aus der Datenbank.

Nehmen wir an, wir sind ein schicker Milliardär, der gerne Autos sammelt. Wir bauen ein Car model, um die Liste der Autos zu speichern, die wir kaufen möchten:

model Car {
  id Int @id @default(autoincrement())
  brand String
  model String
  created_at DateTime @default(now())
  bought Boolean @default(false)
}

Ich empfehle Ihnen dringend, alles in der Referenzdokumentation zum Prisma-Schema nachzuschlagen.

Dieses Modell definiert 5 Felder:id , brand , model , created_at , bought , jeweils mit ihrem Typ, sei es Int, String, DataTime oder Boolean.

id hat den @id -Attribut, was bedeutet, dass es der Primärschlüssel ist , die das Datenbankverwaltungssystem anweist, es eindeutig zu machen. Und es ist standardmäßig ein Wert, der automatisch erhöht wird. Wenn wir also ein neues Element hinzufügen, hat es immer eine eindeutige Ganzzahl, die sich erhöht:1, 2, 3, 4 …

Beachten Sie, dass Sie mit @default(cuid()) auch einen eindeutigen Wert verwenden können oder @default(uuid()) .

created_at verwendet standardmäßig die aktuelle Datumszeit mit @default(now()) , und bought ist standardmäßig false .

Jetzt müssen wir synchronisieren die Datenbank mit unserem Schema. Dazu führen wir den Befehl npx prisma migrate aus um unsere erste Migration zu erstellen :

npx prisma migrate dev

Jetzt können Sie in der Datenbank sehen, dass es ein Car gibt Tabelle:

und eine Datei in Ihrer Codebasis im prisma/migrations Ordner mit den Befehlen zum Erstellen dieser Tabellen, in diesem Fall:

-- CreateTable
CREATE TABLE "Car" (
    "id" SERIAL NOT NULL,
    "brand" TEXT,
    "model" TEXT,
    "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
    "bought" BOOLEAN NOT NULL DEFAULT false,

    PRIMARY KEY ("id")
);

Jedes Mal, wenn Sie das Schema ändern, müssen Sie dieses npx prisma migrate dev ausführen Befehl, um die Änderungen zu übernehmen.

Toll! Jetzt können wir Prisma verwenden, um Daten in die Datenbank einzufügen, Daten abzurufen, Daten zu löschen... und all das.

Installieren Sie nun den @prisma/client Paket mit

npm install @prisma/client

Erstellen Sie eine lib Ordner und darin eine prisma.js Datei. Dort initialisieren wir das PrismaClient-Objekt:

import { PrismaClient } from '@prisma/client'

let global = {}

const prisma = global.prisma || new PrismaClient()

if (process.env.NODE_ENV === 'development') global.prisma = prisma

export default prisma

Dieses Stück Code wird benötigt, um übermäßige Instanziierungen von Prisma zu vermeiden, wenn wir im Entwicklungsmodus laufen, mit häufigen Aktualisierungen aufgrund des Neuladens von Hot-Modulen. Wir fügen im Grunde prisma hinzu zu einer globalen Variablen, wenn wir dies das erste Mal ausführen, und diese Variable die nächsten Male wiederverwenden.

Jetzt können Sie in jeder Datei, die Sie Prisma verwenden möchten,

hinzufügen
import prisma from 'lib/prisma'

und schon kann es losgehen.

Um alle Autos abzurufen, verwenden Sie prisma.car.findMany() :

const cars = await prisma.car.findMany()

Sie können ein Objekt übergeben, um die Daten zu filtern, indem Sie beispielsweise alle Ford auswählen Autos:

const cars = await prisma.car.findMany({
  where: {
    brand: 'Ford',
  },
})

Sie können nach einem einzelnen Auto anhand seiner id suchen Wert mit prisma.car.findUnique() :

const car = await prisma.car.findUnique({
  where: {
    id: 1,
  },
})

Sie können ein neues Auto mit prisma.car.create() hinzufügen :

const car = await prisma.car.create({
  brand: 'Ford',
  model: 'Fiesta',
})

Sie können ein Auto löschen, indem Sie prisma.car.delete() verwenden :

await prisma.job.delete({
  where: { id: 1 },
})

Sie können die Daten eines Autos mit prisma.car.update() aktualisieren :

await prisma.job.delete({
  where: { id: 1 },
  data: {
    bought: true
  }
})

Sie können noch viel mehr tun, aber das sind die Grundlagen, alles, was Sie für den Einstieg benötigen, und 95 % dessen, was Sie in einer einfachen CRUD-Anwendung benötigen.