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

Этот пост в блоге покажет вам, как начать работу с Prisma ORM и насколько он прост в использовании.

Что такое Призма?

Prisma — это ORM с открытым исходным кодом (Object Relational Mapper) для Node.js. Он поддерживает как JavaScript, так и TypeScript. Он действительно превосходен при использовании TypeScript, помогая вам писать как читабельный, так и типобезопасный код.

Почему Призма?

Схемы помогают разработчикам избегать проблем с несогласованностью данных с течением времени. Хотя вы можете определить схему на уровне базы данных в MongoDB, Prisma позволяет вам определить схему на уровне приложения. При использовании Prisma Client разработчик также получает помощь в виде автозавершения запросов, поскольку Prisma Client знает о схеме БД.

Обзор

В этой статье мы узнаем, как реализовать базовую схему в таблице 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, которая представляет собой инструмент с графическим интерфейсом для исследования и управления вашими данными во всех ваших проектах 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

Чтобы начать работу с Prisma Client, вам необходимо установить пакет @prisma/client:

npm install @prisma/client

Обратите внимание, что команда установки автоматически вызывает для вас prisma generate, который считывает вашу схему Prisma и создает версию Prisma Client, адаптированную к вашим моделям.

Всякий раз, когда вы будете вносить изменения в свою схему Prisma в будущем, вам нужно вручную вызвать prisma generate, чтобы учесть изменения в вашем клиентском API Prisma.

После добавления схемы выполните следующую команду, чтобы помочь клиенту Prisma обнаружить изменения:

npx prisma generate

Всякий раз, когда вы будете вносить изменения в свою схему Prisma в будущем, вам нужно вручную вызвать prisma generate, чтобы учесть изменения в вашем клиентском API Prisma.

Теперь давайте перейдем к реализации с 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, мы можем увидеть все вышеперечисленные данные в графическом интерфейсе, выполнив следующую команду:

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.

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

Нравится моя работа? Купи мне кофе.

Эта статья будет использоваться в качестве основы для всех будущих статей о создании подключения к базе данных на моем веб-сайте.