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); })
Вот краткий обзор различных частей фрагмента кода:
- Импортируйте конструктор
PrismaClient
из модуля узла@prisma/client
- Создать экземпляр
PrismaClient
- Определите функцию
async
с именемmain
для отправки запросов в базу данных. - Подключиться к базе данных
- Вызов функции
main
- Закройте соединения с базой данных, когда сценарий завершится
Вы можете настроить приведенный выше код в соответствии с вашим проектом, чтобы он запускался только один раз при запуске приложения и закрывал соединение при завершении работы приложения.
Внутри функции 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.author
↔ User.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.
Запишите свои отзывы или отправьте по электронной почте через контактную форму, если у вас есть какие-либо сомнения, и не забудьте подписаться ниже, чтобы получить больше подобного контента.
Нравится моя работа? Купи мне кофе.
Эта статья будет использоваться в качестве основы для всех будущих статей о создании подключения к базе данных на моем веб-сайте.