Prisma: ORM der nächsten Generation für Node.js und TypeScript
ORM: Object Relation Mapping ist eine Möglichkeit, mit Datenbanken mithilfe von OOP-Sprachen zu kommunizieren, ohne dass komplexe Abfragen geschrieben werden müssen.
mkdir prisma-example cd prisma-example
npm init -y
npm install prisma dotenv express --save-dev
npm install @prisma/client --save-dev
Dadurch wird der Prisma-Client für Ihre Datenbank installiert.
npx prisma init
Dadurch wird ein Prisma-Verzeichnis erstellt, das Folgendes enthält:
Das Video verwendet wahrscheinlich PostgreSQL, aber Sie können dies an MySQL, SQLite oder andere anpassen. Für dieses Beispiel verwenden wir PostgreSQL.
Fügen Sie in Ihrer .env-Datei die Verbindungszeichenfolge hinzu. Beispiel für PostgreSQL:
DATABASE_URL="postgresql://your_user:your_password@localhost:5432/your_database"
Ersetzen Sie Ihren_Benutzer, Ihr_Passwort und Ihre_Datenbank durch Ihre tatsächlichen Anmeldeinformationen. Wenn Sie keinen lokalen PostgreSQL-Server haben, müssen Sie einen installieren und konfigurieren.
Ersetzen Sie den Inhalt von prisma/schema.prisma durch Folgendes:
mkdir prisma-example cd prisma-example
npm init -y
Dadurch wird der typsichere Prisma-Client in node_modules/@prisma/client generiert.
npm install prisma dotenv express --save-dev
Dadurch wird eine neue Migrationsdatei im Verzeichnis prisma/migrations erstellt und auf Ihre Datenbank angewendet, wodurch die Tabellen erstellt werden. Der --name init gibt der Migration einen beschreibenden Namen.
Erstellen Sie eine db.config.js-Datei im Stammverzeichnis und fügen Sie den folgenden Code hinzu:
npm install @prisma/client --save-dev
Dadurch wird eine neue Instanz von PrismaClient erstellt und exportiert, sodass sie in anderen Dateien verwendet werden kann. Die Option log: ['query'] protokolliert alle Abfragen an der Konsole.
Erstellen Sie eine Controllers.js-Datei im Stammverzeichnis des Projekts. Das Folgende ist der Code für CRUD-Operationen in der Datei „controllers.js“:
npx prisma init
Erstellen Sie eine Routes.js-Datei im Stammverzeichnis des Projekts. Das Folgende ist der Code für CRUD-Operationen in der Datei „routes.js“:
DATABASE_URL="postgresql://your_user:your_password@localhost:5432/your_database"
Erstellen Sie eine server.js-Datei im Stammverzeichnis des Projekts. Das Folgende ist der Code für CRUD-Operationen in der Datei server.js:
generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" // Or "mysql", "sqlite", etc. url = env("DATABASE_URL") } model Post { id String @id @default(uuid()) title String content String? createdAt DateTime @default(now()) author User @relation(fields: [user_id], references: [id]) user_id Int } model User { id Int @id @default(autoincrement()) email String @unique name String? posts Post[] }
npx prisma generate
Dadurch wird das Skript ausgeführt, ein Benutzer und ein Beitrag in Ihrer Datenbank erstellt, dann der Benutzer aktualisiert und der Beitrag gelöscht.
Sie können Postman verwenden, um die API mit den folgenden Routen zu testen:
Legen Sie den Text in Postman für die POST-Anfrage als JSON mit den folgenden Daten fest:
npx prisma migrate dev --name init
import { PrismaClient } from "@prisma/client"; const prisma = new PrismaClient({ log: ["query"], }); export default prisma;
Prisma bietet mehrere Aggregationsfunktionen, mit denen Sie Berechnungen für Datensätze direkt in Ihren Datenbankabfragen durchführen können. Diese Funktionen sind nützlich, um Daten zusammenzufassen und Erkenntnisse zu gewinnen, ohne große Datenmengen in Ihre Anwendung abrufen zu müssen.
Nehmen wir an, wir haben das folgende Produktmodell:
mkdir prisma-example cd prisma-example
npm init -y
npm install prisma dotenv express --save-dev
npm install @prisma/client --save-dev
npx prisma init
Prisma bietet zahlreiche Filteroptionen, mit denen Sie Ihre Datenbank präzise abfragen können. Hier ist eine umfassende Übersicht mit Beispielen:
gleich (Standard):Prüft auf genaue Gleichheit.
DATABASE_URL="postgresql://your_user:your_password@localhost:5432/your_database"
nicht: Negiert eine Bedingung.
generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" // Or "mysql", "sqlite", etc. url = env("DATABASE_URL") } model Post { id String @id @default(uuid()) title String content String? createdAt DateTime @default(now()) author User @relation(fields: [user_id], references: [id]) user_id Int } model User { id Int @id @default(autoincrement()) email String @unique name String? posts Post[] }
gt (Größer als), gte (Größer als oder gleich), lt (Kleiner als), lte (Kleiner als oder gleich): Wird für numerische und Datums-/Uhrzeitvergleiche verwendet.
npx prisma generate
enthält:Überprüft, ob eine Zeichenfolge eine Teilzeichenfolge enthält.
npx prisma migrate dev --name init
startsWith:Überprüft, ob eine Zeichenfolge mit einem Präfix beginnt.
import { PrismaClient } from "@prisma/client"; const prisma = new PrismaClient({ log: ["query"], }); export default prisma;
endsWith:Überprüft, ob eine Zeichenfolge mit einem Suffix endet.
import prisma from "./db.config.js"; // create user export const createUser = async (req, res) => { const { name, email } = req.body; const existing_user = await prisma.user.findUnique({ where: { email, }, }); if (existing_user) { return res.status(400).json({ message: "User already exists" }); } const user = await prisma.user.create({ data: { email, name, }, }); return res.status(201).json(user); }; // create post export const createPost = async (req, res) => { const { title, content, user_id } = req.body; const post = await prisma.post.create({ data: { title, content, user_id, }, }); return res.status(201).json(post); }; // get all users export const getUsers = async (req, res) => { const users = await prisma.user.findMany({ include: { posts: true, }, }); return res.status(200).json(users); }; // read specific user by id export const getUserById = async (req, res) => { const { id } = req.params; const user = await prisma.user.findUnique({ where: { id: parseInt(id), }, include: { posts: true, }, }); if (!user) { return res.status(404).json({ message: "User not found" }); } return res.status(200).json(user); }; // update user export const updateUser = async (req, res) => { const { id } = req.params; const { name, email } = req.body; const user = await prisma.user.update({ where: { id: parseInt(id), }, data: { name, email, }, }); return res.status(200).json(user); }; // delete user export const deleteUser = async (req, res) => { const { id } = req.params; const user = await prisma.user.delete({ where: { id: parseInt(id), }, }); return res.status(200).json(user); }; // create similar for post
Modus: ohne Berücksichtigung: Führt Suchvorgänge ohne Berücksichtigung der Groß- und Kleinschreibung durch.
import express from "express"; import { createUser, createPost, getUsers, getUserById, updateUser, deleteUser, } from "./controllers.js"; const router = express.Router(); router.post("/users", createUser); router.get("/users", getUsers); router.get("/users/:id", getUserById); router.put("/users/:id", updateUser); router.delete("/users/:id", deleteUser); // create similar for post router.post("/posts", createPost); // router.get('/posts', getPosts); // router.get('/posts/:id', getPostById); // router.put('/posts/:id', updatePost); // router.delete('/posts/:id', deletePost); export default router;
in:Überprüft, ob ein Wert in einer Liste vorhanden ist.
import express from "express"; import dotenv from "dotenv"; import router from "./routes.js"; dotenv.config(); const app = express(); app.use(express.json()); app.use("/api", router); const PORT = process.env.PORT || 5000; app.listen(PORT, () => { console.log(`Server running on port ${PORT}`); });
notIn: Prüft, ob ein Wert nicht in einer Liste vorhanden ist.
node index.js
UND: Kombiniert mehrere Bedingungen mit einem logischen UND.
{ "name": "John Doe", "email": "sample@example.com" }
ODER: Kombiniert mehrere Bedingungen mit einem logischen ODER.
// get all posts of a user with id const user = await prisma.user.findUnique({ where: { id: parseInt(id), }, include: { posts: true, }, }); // select specific fields of user with post details const user = await prisma.user.findUnique({ where: { id: parseInt(id), }, select: { name: true, posts: { select: { title: true, content: true, }, }, }, }); // get all users name with their posts count (Aggregation) const req_data = await prisma.user.findMany({ select: { id: true, name: true, _count: { select: { post: true, }, }, }, });
NICHT: Negiert eine Gruppe von Bedingungen.
model Product { id Int @id @default(autoincrement()) name String price Float category String createdAt DateTime @default(now()) }
Sie können nach verwandten Modellen filtern.
mkdir prisma-example cd prisma-example
npm init -y
Sie können diese Operatoren für eine komplexe Filterlogik kombinieren.
npm install prisma dotenv express --save-dev
Diese Beispiele decken die häufigsten Filterszenarien in Prisma ab. Durch die Kombination dieser Operatoren und verschachtelten Filter können Sie sehr präzise Abfragen erstellen, um genau die Daten abzurufen, die Sie benötigen. Denken Sie daran, für die aktuellsten und detailliertesten Informationen die offizielle Prisma-Dokumentation zu konsultieren.
Mit der Option „orderBy“ von Prisma können Sie die Ergebnisse Ihrer Abfragen sortieren. Hier sind einige Beispiele, die seine Verwendung veranschaulichen:
Aufsteigende Reihenfolge (Standard):
npm install @prisma/client --save-dev
Absteigende Reihenfolge:
npx prisma init
Sie können mehrere Felder angeben, nach denen sortiert werden soll, mit jeweils unterschiedlichen Richtungen. Prisma sortiert zuerst nach dem ersten Feld, dann nach dem zweiten Feld innerhalb von Gruppen identischer Werte im ersten Feld und so weiter.
DATABASE_URL="postgresql://your_user:your_password@localhost:5432/your_database"
In diesem Beispiel werden die Beiträge hauptsächlich nach dem Namen des Autors in aufsteigender Reihenfolge sortiert. Wenn mehrere Beiträge denselben Autor haben, werden sie in absteigender Reihenfolge nach ihrem Titel sortiert.
Wie im vorherigen Beispiel gezeigt, können Sie nach Feldern für verwandte Modelle sortieren.
generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" // Or "mysql", "sqlite", etc. url = env("DATABASE_URL") } model Post { id String @id @default(uuid()) title String content String? createdAt DateTime @default(now()) author User @relation(fields: [user_id], references: [id]) user_id Int } model User { id Int @id @default(autoincrement()) email String @unique name String? posts Post[] }
Dadurch werden Beiträge nach der E-Mail-Adresse ihrer Autoren sortiert.
Sie können auch nach Datums- und Uhrzeitfeldern sortieren.
npx prisma generate
Sie können nach einem Feld filtern und nach einem anderen sortieren. Beispielsweise möchten Sie möglicherweise alle Benutzer finden, deren Name „test“ enthält, sie aber nach ihrer E-Mail-Adresse sortieren:
npx prisma migrate dev --name init
Sie können steuern, wie Nullwerte bei der Sortierung behandelt werden. Die Nulls-Option kann entweder auf „first“ oder „last“ gesetzt werden.
import { PrismaClient } from "@prisma/client"; const prisma = new PrismaClient({ log: ["query"], }); export default prisma;
Standardmäßig werden Nullwerte beim Sortieren in aufsteigender Reihenfolge an letzter Stelle und beim Sortieren in absteigender Reihenfolge an erster Stelle platziert. Mit der Nulls-Option können Sie dieses Standardverhalten überschreiben.
Prisma zeichnet sich durch den eleganten Umgang mit Datenbankbeziehungen aus. Hier sind die wichtigsten Aspekte:
Beziehungen im Schema definieren: Sie definieren Beziehungen zwischen Modellen direkt in Ihrer schema.prisma-Datei mit dem @relation-Attribut.
Arten von Beziehungen: Prisma unterstützt:
Verwenden wir die User- und Post-Modelle aus den vorherigen Beispielen:
mkdir prisma-example cd prisma-example
Ich hoffe, dies hilft Ihnen, das Prisma ORM besser zu verstehen.
Geben Sie uns gerne Ihr Feedback und Ihre Vorschläge.
Danke fürs Lesen! ?
Das obige ist der detaillierte Inhalt vonPrisma ORM: Beginnen Sie mit dem Projekt mit JS. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!