Prisma ORM: Спрощення управління базами даних у Node.js

pic

Фото Bruno Scramgnon на Unsplash

Prisma ORM — це сучасний набір інструментів для роботи з базами даних, який спрощує взаємодію з базами даних у Node.js додатках. Завдяки інтуїтивно зрозумілому підходу на основі схем і потужному генератору клієнтів, Prisma дозволяє легше визначати, запитувати та керувати вашою базою даних.

Що таке Prisma ORM?

Prisma ORM — це інструмент для об’єктно-реляційного відображення (ORM), який з’єднує вашу програму з базою даних. Він надає типобезпечний API для взаємодії з базами даних, що робить операції з базою даних більш безпечними та менш схильними до помилок. Prisma підтримує різні бази даних, включаючи PostgreSQL, MySQL, SQLite та MongoDB.

Які проблеми вирішує Prisma?

Prisma вирішує кілька проблем, з якими стикаються розробники при роботі з базами даних:

  • Бойлерплейт код: Традиційні операції з базами даних часто вимагають повторюваних і громіздких SQL запитів. Prisma усуває цю проблему, надаючи абстрактний і типобезпечний інтерфейс запитів.
  • Типобезпека: Завдяки Prisma ваша схема бази даних має строгий тип, що знижує ймовірність помилок під час виконання.
  • Підтримка різних баз даних: Prisma підтримує кілька провайдерів баз даних, що дозволяє легко виконувати міграцію і дає більшу гнучкість.
  • Простота роботи з відносинами: Керування відносинами між таблицями спрощується завдяки схемі та клієнту Prisma.

Чому варто вибрати Prisma ORM?

Ось кілька причин, чому варто обрати Prisma для вашого наступного проєкту:

  • Типобезпечні запити: Вбудована підтримка TypeScript гарантує типобезпеку.
  • Досвід розробника: Розширена екосистема, включаючи розширення для VS Code для редагування схем.
  • Швидка розробка: Підхід розробки, орієнтований на схеми, робить проектування бази даних інтуїтивно зрозумілим.
  • Повна документація: Документація Prisma і активна спільнота роблять навчання та впровадження легким.

Початок роботи з Prisma

Давайте розглянемо, як налаштувати Prisma в Node.js додатку.

Встановлення

Встановіть Prisma CLI та необхідні залежності:

npm install prisma --save-dev  
npm install @prisma/client

Пакет prisma — це інструмент командного рядка для керування Prisma, а @prisma/client — це автостворений клієнт для взаємодії з базою даних.

Ініціалізація Prisma

Виконайте наступну команду для ініціалізації Prisma у вашому проєкті:

npx prisma init

Це створить наступні файли:

  • Каталог prisma з файлом schema.prisma.
  • Файл .env для зберігання змінних середовища, таких як URL вашої бази даних.

Налаштування файлу .env

У файлі .env визначте рядок підключення до вашої бази даних:

DATABASE_URL="mongodb+srv://username:[email protected]/mydatabase"

Замініть username, password та mydatabase на ваші дані для підключення до MongoDB.

Редагування файлу schema.prisma

Файл schema.prisma визначає схему вашої бази даних і відносини між таблицями.
Ось приклад схеми:

# Це ваш файл Prisma схеми,  
# більше інформації можна знайти в документації: https://pris.ly/d/prisma-schema  

generator client {  
 provider = "prisma-client-js"  
}  
datasource db {  
 provider = "mongodb"  
 url = env("DATABASE_URL")  
}  
model User {  
 id String @id @default(auto()) @map("_id") @db.ObjectId  
 name String?  
 email String @unique  
 password String  
 posts Post[]  
}  
model Post {  
 id String @id @default(auto()) @map("_id") @db.ObjectId  
 slug String  
 title String  
 body String  
 author User @relation(fields: [authorId], references: [id])  
 authorId String @db.ObjectId  
}

Пояснення

Generator (генератор): Вказує, що Prisma буде генерувати клієнт на JavaScript/TypeScript.

Datasource db (джерело даних db): Підключає Prisma до бази даних MongoDB, використовуючи DATABASE_URL з файлу .env.

Models (моделі): Визначають ваші колекції (User та Post) та їх відносини.

  • Модель User (Користувач): Представляє користувача з полями, такими як id, name, email, а також зв'язок один до багатьох з постами.
  • Модель Post (Пост): Представляє блог-пост з полями, такими як id, title, body, та зв'язок багато до одного з користувачем.

Анотації

  • @id: Позначає поле як основний ключ моделі.
  • @default(auto()): Автоматично генерує унікальне значення для поля, зазвичай використовується для ObjectId у MongoDB.
  • @map("_id"): Відображає поле на стовпець або властивість документа _id, яка є за замовчуванням ідентифікатором у MongoDB.
  • @db.ObjectId: Вказує, що поле зберігається як ObjectId у базі даних, що забезпечує сумісність з MongoDB.
  • @unique: Забезпечує унікальність значення поля серед усіх записів у колекції.
  • @relation: Визначає відносини між моделями.
    Наприклад, модель Post має відношення до моделі User, використовуючи authorId як зовнішній ключ.
  • fields та references у @relation: Вказують зовнішній ключ (fields) і основний ключ, на який посилаються (references).

Встановлення Prisma Client

Після визначення вашої схеми, згенеруйте Prisma Client:

npx prisma generate

Це створює типобезпечний клієнт у папці node_modules/@prisma/client, який ви можете використовувати для взаємодії з вашою базою даних.

Налаштування Prisma Client

Створіть багаторазовий екземпляр Prisma Client у вашому проекті:

*Файл: * prisma/index.js

const { PrismaClient } = require('@prisma/client');  
const prisma = new PrismaClient();  
module.exports = prisma;

Це налаштування гарантує, що у вас буде лише один екземпляр Prisma Client, який можна імпортувати у вашому додатку.

CRUD операції з Prisma

Створення нового користувача

Ось як можна додати нового користувача до бази даних:

const prisma = require('./prisma/index');  

async function createUser(name, email, password) {  
 const user = await prisma.user.create({  
 data: {  
 name,  
 email,  
 password,  
 },  
 });  
 console.log('User created:', user);  
}  
createUser('John Doe', '[email protected]', 'securepassword')  
 .catch((e) => console.error(e))  
 .finally(async () => {  
 await prisma.$disconnect();  
 });

Пошук користувача за email

Щоб знайти користувача за його електронною адресою:

const prisma = require('./prisma/index');  

async function findUserByEmail(email) {  
 const user = await prisma.user.findUnique({  
 where: {  
 email,  
 },  
 });  
 if (user) {  
 console.log('User found:', user);  
 } else {  
 console.log('User not found');  
 }  
}  
findUserByEmail('[email protected]')  
 .catch((e) => console.error(e))  
 .finally(async () => {  
 await prisma.$disconnect();  
 });

Створення поста

Щоб створити новий пост, асоційований з користувачем:

const prisma = require('./prisma/index');  

async function createPost(slug, title, body, authorId) {  
 const result = await prisma.post.create({  
 data: {  
 slug,  
 title,  
 body,  
 author: { connect: { id: authorId } },  
 },  
 });  
 console.log('Post created:', result);  
}  
createPost('my-first-post', 'My First Post', 'This is the content of the post.', 'author-id-here')  
 .catch((e) => console.error(e))  
 .finally(async () => {  
 await prisma.$disconnect();  
 });
  • connect: Це вказує, що існуючий запис у пов'язаній моделі (User) має бути зв'язаний з поточним записом, що створюється або оновлюється.
  • id : authorId: Вказує ідентифікатор пов'язаного запису користувача, з яким потрібно пов'язати пост. authorId є змінною, яка містить унікальний ID користувача, якого ви хочете асоціювати з постом.

Оновлення поста

Щоб оновити існуючий пост:

const prisma = require('./prisma/index');  

async function updatePost(id, title, body) {  
 const result = await prisma.post.update({  
 where: {  
 id,  
 },  
 data: {  
 title, // оновлює старий заголовок новим.  
 body, // оновлює старий текст новим.
},  
 });  
 console.log('Post updated:', result);  
}  
updatePost('post-id-here', 'Updated Title', 'Updated Content')  
 .catch((e) => console.error(e))  
 .finally(async () => {  
 await prisma.$disconnect();  
 });

Видалення поста

Щоб видалити пост:

const prisma = require('./prisma/index');  

async function deletePost(id) {  
 const result = await prisma.post.delete({  
 where: {  
 id,  
 },  
 });  
 console.log('Post deleted:', result);  
}  
deletePost('post-id-here')  
 .catch((e) => console.error(e))  
 .finally(async () => {  
 await prisma.$disconnect();  
 });

Отримання всіх постів

Щоб отримати всі пости:

const prisma = require('./prisma/index');  

async function getAllPosts() {  
 const result = await prisma.post.findMany();  
 console.log('All Posts:', result);  
}  
getAllPosts()  
 .catch((e) => console.error(e))  
 .finally(async () => {  
 await prisma.$disconnect();  
 });

Найкращі практики

  • Централізований клієнт: Використовуйте один екземпляр Prisma Client для ефективного управління підключеннями до бази даних.
  • Плавне завершення роботи: Завжди відключайте Prisma Client, коли ваше застосування завершується.
  • Конфігурації для різних середовищ: Використовуйте різні файли .env для розробки, тестування та продакшн-середовища.

Висновок

Prisma ORM змінює спосіб взаємодії розробників з базами даних, поєднуючи типобезпечність, зручність використання та потужні можливості. Його підхід, орієнтований на схеми, у поєднанні з інтуїтивно зрозумілим клієнтом робить Prisma відмінним вибором для розробки сучасних застосунків. Незалежно від того, чи ви створюєте маленький проект чи великомасштабний додаток, Prisma спрощує управління базою даних, дозволяючи вам зосередитися на створенні чудових функцій.

Перекладено з: Prisma ORM: Simplifying Database Management in Node.js

Leave a Reply

Your email address will not be published. Required fields are marked *