Prisma ORM привлича много внимание в общността на разработчиците. И за добра причина: Prisma улеснява създаването на схема на база данни, като я поддържа актуална с промените в модела на данните на вашето приложение.

Тази публикация в блога ще ви покаже как да започнете с Prisma ORM и колко лесен е за използване.

Какво е Prisma?

Prisma е ORM (Object Relational Mapper) с отворен код за Node.js. Поддържа както JavaScript, така и TypeScript. Той наистина превъзхожда, когато използвате TypeScript, като ви помага да пишете както четим, така и безопасен код.

Защо Prisma?

Схемите помагат на разработчиците да избегнат проблеми с несъответствието на данните с течение на времето. Докато можете да дефинирате схема на ниво база данни в MongoDB, Prisma ви позволява да дефинирате схема на ниво приложение. Когато използва Prisma Client, разработчикът също получава помощта за автоматично попълване на заявки, тъй като Prisma Client е наясно със схемата на DB.

Преглед

В тази статия ще научим как да внедрим основна схема в таблицата MongoDB с Prisma.

Настройка на MongoDB

Ще използвам безплатно споделено копие на MongoDB Atlas. Можете също да го свържете към вече съществуващото си копие на MongoDB. За да създадете безплатен екземпляр на MongoDB, посетете тук.

След като създадете клъстер, отговорете на въпросите за сигурност, за да добавите нов потребител с парола. След като настройката е готова, щракнете върху бутона Connectна картата на клъстера и изберете опцията, която казва Connect your application и копирайте низа за свързване.

Вашият низ за свързване ще изглежда така. Може да се наложи да добавите името на вашата база данни в края преди параметрите на заявката. Ако нямате никаква база данни, можете да добавите всяко име, което предпочитате, Prisma ще го създаде за вас.

mongodb+srv://myuser:[email protected]/mydatabasename?retryWrites=true&w=majority

С низа за свързване работата ни по уебсайта MongoDB е завършена и вече можем да започнем с инициализацията на Prisma.

Основи и схема на Prisma

Prisma е сървърна библиотека, която помага на разработчиците да четат и записват данни в базата данни по интуитивен, ефективен и безопасен начин.

Можете да управлявате своя модел на данни, миграции и също така предлага Prisma клиент, който ви помага при проверка на типа, докато пишете код. Освен това идва с Prisma studio, което е GUI инструмент за изследване и манипулиране на вашите данни във всичките ви проекти на Prisma.

Prisma разчита на schema.prisma файл във вашия проект, където дефинирате вашата схема.

Можем да инициираме Prisma в нашия проект, като използваме тези команди в случай на javascript проект.

npm install prisma --save-dev
npx prisma init

В случай на машинопис:

npm install prisma typescript ts-node @types/node --save-dev
npx prisma init

Резултатът ще изглежда нещо като по-долу и в двата случая:

След това създайте файл tsconfig.json в корена и добавете следната конфигурация към него:

tsconfig.json (само машинопис)

{
  "compilerOptions": {
    "sourceMap": true,
    "outDir": "dist",
    "strict": true,
    "lib": ["esnext"],
    "esModuleInterop": true
  }
}

Тези команди биха направили следните неща:

  • Инсталирайте всички Prisma пакети
  • създайте нова директория, наречена prisma, която съдържа файл, наречен schema.prisma, който съдържа схемата на Prisma с вашата променлива за връзка с базата данни и модели на схема
  • създава .env файл в основната директория на проекта, който се използва за дефиниране на променливи на средата (като връзката ви с база данни)

Конфигурирайте .env променливи

Сега отворете файла .env, ще има променлива с име DATABASE_URL. Моля, поставете тук свързващия низ, генериран по време на стъпката за настройка на MongoDB.

DATABASE_URL="mongodb+srv://myuser:[email protected]/mydatabasename?retryWrites=true&w=majority"

Имаме готови всички предварителни стъпки за Prisma. Сега ще преминем към написването на основна схема на модел Post-Comment-User. Ето диаграма, обясняваща схемата, която ще изградим.

За да приложите тази структура, във вашия schema.prisma файл, направете следното:

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

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

model Post {
  id       String    @id @default(auto()) @map("_id") @db.ObjectId
  slug     String    @unique
  title    String
  body     String
  comments Comment[]
  author   User      @relation(fields: [authorId], references: [id])
  authorId String    @db.ObjectId
}

model Comment {
  id      String @id @default(auto()) @map("_id") @db.ObjectId
  post    Post   @relation(fields: [postId], references: [id])
  postId  String @db.ObjectId
  comment String
}

model User {
  id    String  @id @default(auto()) @map("_id") @db.ObjectId
  email String  @unique
  name  String?
  posts Post[]
}

Първите два блока дефинират настройките на Prisma за MongoDB. Той взема URL адреса на базата данни от .env файла по-горе.

Атрибутът @id се използва за дефиниране на ID ключ в MongoDB, който обикновено е _id в базата данни и тъй като Prisma не използва долна черта, ние използваме @map, за да го съпоставим с _id.

Можете да прочетете повече за всички атрибути, налични в Prisma тук.

@relation дефинира връзката между две таблици въз основа на полета. Може да бъде от няколко вида като едно към едно, едно към много и много към много. Тук полетадефинират полето от текущата таблица, а препратките сочат към ключа за препратка от свързаната таблица. Научете повече за отношенията тук.

Инсталирайте и генерирайте Prisma Client

За да започнете с Prisma Client, трябва да инсталирате пакета @prisma/client:

npm install @prisma/client

Забележете, че командата за инсталиране автоматично извиква prisma generate за вас, който чете вашата Prisma схема и генерира версия на Prisma Client, която е пригодена за вашите модели.

Всеки път, когато правите промени във вашата Prisma схема в бъдеще, трябва ръчно да извикате prisma generate, за да се съобразят промените във вашия Prisma Client API.

След като добавите схемата, изпълнете следната команда, за да помогнете на Prisma клиента да открие промените:

npx prisma generate

Всеки път, когато правите промени във вашата Prisma схема в бъдеще, трябва ръчно да извикате prisma generate, за да се съобразят промените във вашия Prisma Client API.

Нека да преминем към внедряването с NodeJS сега. Частта по-горе ще бъде обща за всички реализации и ние ще я цитираме по-долу.

Внедряване в NodeJS

Започнете, като следвате инструкциите за настройка на MongoDB и Prisma по-горе.

Javascript

Създайте index.js файл в корена на проекта и напишете следното, за да инициализирате връзката.

const { PrismaClient } = require('@prisma/client');

const prisma = new PrismaClient();

async function main() {
  // Connect the client
  await prisma.$connect();
  // ... our Prisma client queries would go here.
}

main()
  .then(async () => {
    await prisma.$disconnect();
  })
  .catch(async (e) => {
    console.error(e);
    await prisma.$disconnect();
    process.exit(1);
  })

Машинопис

Създайте файл index.ts в корена на проекта и напишете следното, за да инициализирате връзката.

import { PrismaClient } from '@prisma/client';

const prisma = new PrismaClient();

async function main() {
  // Connect the client
  await prisma.$connect();
  // ... our Prisma client queries would go here.
}

main()
  .then(async () => {
    await prisma.$disconnect();
  })
  .catch(async (e) => {
    console.error(e);
    await prisma.$disconnect();
    process.exit(1);
  })

Ето бърз преглед на различните части на кодовия фрагмент:

  1. Импортирайте конструктора PrismaClient от модула на възела @prisma/client
  2. Създаване на екземпляр PrismaClient
  3. Дефинирайте async функция с име main за изпращане на заявки към базата данни
  4. Свържете се с базата данни
  5. Извикайте функцията main
  6. Затворете връзките към базата данни, когато скриптът приключи

Можете да конфигурирате горния код според вашия проект, така че да се изпълнява само веднъж при стартиране на приложението и да затваря връзката при изключване на приложението.

Във функцията main ще добавим всички заявки за извършване на CRUD операции.

ЧЕТЕТЕ

async function main() {
  // Connect the client
  await prisma.$connect();
  // ... our Prisma client queries would go here.
  const allUsers = await prisma.user.findMany();
  console.log(allUsers);
}

Когато стартирате приложението, като използвате node index.js или npx ts-node index.ts в случай на машинопис, това трябва да отпечата празен масив, защото все още няма User записи в базата данни:

[]

findMany връща списъка с всички записи в таблицата User. Можете да намерите всички „заявки за модели“.

СЪЗДАВАЙТЕ

Ще научим как да пишем заявка за записване на нови записи в таблиците Post, User и Comment.

Коригирайте функцията main, за да изпратите create заявка към базата данни:

async function main() {
  await prisma.$connect();

  await prisma.user.create({
    data: {
      name: 'Deepinder',
      email: '[email protected]',
      posts: {
        create: {
          title: 'My first post',
          body: 'Interesting blog stuff',
          slug: 'my-first-post',
        },
      },
    },
  });

  const allUsers = await prisma.user.findMany({
    include: {
      posts: true,
    },
  });
  console.dir(allUsers, { depth: null });
}

Този код създава нов User запис заедно с нов Post с помощта на заявка за вложено записване. Записът User е свързан с другия чрез съответно Post.authorUser.posts полета за връзка.

Забележете, че предаваме опцията include на findMany, която казва на Prisma Client да включи posts отношенията към върнатите User обекти.

След изпълнение на горното изходът трябва да изглежда подобно на това:

Както споменахме по-горе за инструмента за визуализация Prisma Studio, можем да видим всички горепосочени данни в GUI, като изпълним следната команда:

npx prisma studio

Горната команда ще отвори графичен потребителски интерфейс на уеб браузър и ще изглежда подобно на това с потребителя и публикацията по-горе.

АКТУАЛИЗАЦИЯ

async function main() {
  await prisma.$connect();

  await prisma.post.update({
    where: {
      slug: 'my-first-post',
    },
    data: {
      comments: {
        createMany: {
          data: [
            { comment: "Amazing post!" },
            { comment: "Can't wait to read more of these!" },
          ],
        },
      },
    },
  });
  const posts = await prisma.post.findMany({
    include: {
      comments: true,
    },
  });

  console.dir(posts, { depth: Infinity });
}

Резултатът от горния код ще изглежда подобно на това:

Той създава новите коментари във връзка с публикацията, използвайки заявката UPDATE.

ИЗТРИВАНЕ

Можем също да изтрием запис като този.

async function main() {
  await prisma.$connect();

  await prisma.comment.delete({
    where: {
      id: "63b3fdd797879fac42a03b76",
    },
  });
  const comments = await prisma.comment.findMany();

  console.log(comments);
}

Ще изтрие първия запис с низа за коментар „Невероятна публикация!“

Ако искате да изтриете запис с връзка, можете да прочетете повече за Каскадно изтриване.

Целият код по-горе може да бъде намерен в моя github.

Запишете отзивите си или изпратете имейл от формата за контакт, ако имате някакви съмнения, и не забравяйте да се абонирате по-долу за повече съдържание като това.

Харесва ли работата ми? Купете ми кафе.

Тази статия ще се използва като основа за всички бъдещи статии, създаващи връзка с база данни на моя уебсайт.