Фото 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