текст перекладу
Створення надійних застосунків за допомогою Next.js та Drizzle ORM
Сучасні веб-застосунки потребують ефективного оброблення даних та взаємодії з SQL базами даних. SQL бази даних, відомі своєю структурованою організацією даних, надають потужний спосіб зберігання та запиту інформації. Однак написання сирих SQL запитів може швидко стати складним та схильним до помилок, особливо в великих застосунках. Ось тут і з'являються бібліотеки для обробки об'єктно-реляційних мапувань (ORM) такі як Drizzle. У цій статті ми розглянемо SQL бази даних, складнощі написання складних запитів і як Drizzle ORM надає типізоване та елегантне рішення для керування SQL запитами в застосунку на Next.js.
Що таке SQL база даних?
SQL (Structured Query Language) база даних — це тип бази даних, що організує дані у таблиці, які складаються з рядків і стовпців. Така таблична структура дозволяє ефективно зберігати, отримувати та управляти даними.
Ключові концепції:
- Таблиці: представляють сутності (наприклад,
users
,products
). Кожна таблиця має визначену схему, що описує її стовпці. - Стовпці: визначають атрибути сутності (наприклад,
id
,name
,email
). - Рядки: представляють окремі записи в таблиці.
Взаємозв'язки між таблицями
SQL бази даних часто включають взаємозв'язки між таблицями:
- Один до одного: кожен рядок однієї таблиці відповідає одному рядку іншої (наприклад,
users
іprofiles
). - Один до багатьох: один рядок з однієї таблиці відповідає кільком рядкам іншої (наприклад,
categories
іproducts
). - Багато до багатьох: рядки в двох таблицях відповідають кільком рядкам в кожній з таблиць (наприклад,
students
іcourses
через таблицюenrollments
).
Складність SQL запитів
Якщо застосунки зростають, SQL запити часто стають складними. Ось приклад складного SQL запиту:
Приклад: складний SQL запит
SELECT
orders.id AS order_id,
customers.name AS customer_name,
SUM(order_items.quantity * products.price) AS total_amount,
COUNT(order_items.id) AS total_items
FROM
orders
JOIN
customers ON orders.customer_id = customers.id
JOIN
order_items ON orders.id = order_items.order_id
JOIN
products ON order_items.product_id = products.id
WHERE
orders.created_at BETWEEN '2023-01-01' AND '2023-12-31'
GROUP BY
orders.id, customers.name
HAVING
total_amount > 500
ORDER BY
total_amount DESC;
Пояснення:
Цей запит обчислює:
- Загальну суму для кожного замовлення.
- Загальну кількість товарів в кожному замовленні.
- Фільтрує замовлення, зроблені в 2023 році, із сумою понад $500.
- З'єднує кілька таблиць для отримання зв'язаних даних.
Складнощі:
- Помилковий синтаксис.
- Відсутність статичної типізації.
- Важко керувати, коли запити стають складнішими.
Чому використовувати ORM?
ORM (Object-Relational Mapper) надає структуру для взаємодії з базами даних через мову програмування. ORM перетворює рядки бази даних на об'єкти, абстрагуючи складнощі SQL і надаючи інструкції для структури запитів.
Переваги:
- Типізовані запити: забезпечують правильність завдяки статичній типізації.
- Зрозумілість коду: спрощують синтаксис.
- Повторне використання: абстраговані запити можна повторно використовувати та підтримувати.
Вступ до Drizzle ORM
Drizzle ORM — це легкий, типобезпечний ORM, який спрощує написання SQL запитів, зберігаючи потужність сирого SQL. Він особливо підходить для проєктів на TypeScript, забезпечуючи підтримку статичної типізації та автодоповнення.
Чому Drizzle?
- Типобезпечність: повністю типізовані SQL запити.
- Легкість: мінімальна абстракція поверх SQL.
- Модульність: запити є модульними та легко повторно використовуються.
- Гнучкість: зберігається контроль над сирим SQL, коли це необхідно.
Налаштування Drizzle з Next.js
1. Встановлення залежностей
Встановіть необхідні пакети:
npm install drizzle-orm drizzle-kit sqlite3
текст перекладу
# Налаштування Drizzle
Створіть файл `db.ts` для налаштування Drizzle ORM:
import { drizzle } from 'drizzle-orm/sqlite3';
import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';
import sqlite3 from 'sqlite3';
// Ініціалізація SQLite бази даних
const sqlite = new sqlite3.Database('./db.sqlite');
// Опис таблиць
export const users = sqliteTable('users', {
id: integer('id').primaryKey().autoIncrement(),
name: text('name').notNull(),
email: text('email').notNull(),
});
export const db = drizzle(sqlite);
```
3. Ініціалізація схеми бази даних
Створіть схему бази даних за допомогою Drizzle Kit:
drizzle-kit generate:sqlite --out ./migrations
Приклад API маршруту: Отримання даних за допомогою Drizzle
Ось приклад API маршруту Next.js для отримання користувачів:
API маршрут: /api/users
import { NextApiRequest, NextApiResponse } from 'next';
import { db, users } from '../../db';
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
try {
// Отримання всіх користувачів
const result = await db.select().from(users).all();
res.status(200).json({ users: result });
} catch (error) {
res.status(500).json({ error: 'Не вдалося отримати користувачів' });
}
}
Переваги використання Drizzle ORM
Типізовані запити:
const user = await db .select() .from(users) .where(users.email.eq('[email protected]')) .get();
- TypeScript забезпечує правильність запиту та його відповідність схемі таблиці.
- Зрозумілий код: запити короткі, що знижує обсяг шаблонного коду та підвищує зручність обслуговування.
- Складні запити: Drizzle ORM підтримує складні SQL операції, такі як об'єднання (joins), агрегації та інше, зберігаючи при цьому чистий синтаксис.
Альтернативи Drizzle ORM для керування SQL базами даних
Drizzle ORM — це легкий і типобезпечний інструмент для керування SQL запитами, особливо в проєктах на TypeScript. Однак, залежно від складності вашого застосунку, потреб у масштабуванні чи вподобань розробників, можна розглянути й інші альтернативи ORM. Ось три популярні альтернативи Drizzle ORM:
1. Prisma
Prisma — це сучасний ORM, створений для спрощення роботи з базами даних у JavaScript та TypeScript проєктах. Його типобезпечний підхід і орієнтація на продуктивність розробника роблять його популярним серед багатьох програмістів.
Ключові функції:
- Типобезпечність: автоматично генерує типи TypeScript для вашої схеми бази даних.
- Prisma Client: надає інтуїтивно зрозумілий API для запитів до бази даних.
- Опис схеми: використовує декларативну схему Prisma для визначення моделей даних.
- Підтримка кількох баз даних: працює з PostgreSQL, MySQL, SQLite, MongoDB та іншими.
- Міграції: включає інструменти для керування міграціями.
Приклад коду:
Опис схеми Prisma
// schema.prisma
model User {
id Int @id @default(autoincrement())
name String
email String @unique
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
title String
content String
authorId Int
author User @relation(fields: [authorId], references: [id])
}
Запит даних за допомогою Prisma Client
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
async function main() {
const users = await prisma.user.findMany({ include: { posts: true } });
console.log(users);
}
main();
Коли використовувати Prisma:
- Якщо вам потрібні потужні інструменти для бази даних з міграціями.
- Якщо ви надаєте перевагу зручному API для розробника і типобезпечності.
- Якщо ваш проєкт потребує підтримки кількох баз даних.
2. TypeORM
TypeORM — це багатофункціональний ORM для TypeScript та JavaScript, який підтримує реляційні та NoSQL бази даних.
текст перекладу
It follows the Active Record and Data Mapper patterns, giving developers flexibility in how they manage their database logic.
Ключові функції:
- Незалежність від бази даних: Підтримує PostgreSQL, MySQL, SQLite, MongoDB та інші.
- Декоратори для схеми: Використовує декоратори TypeScript для визначення сутностей та зв'язків.
- Шаблон репозиторію: Надає методи для операцій CRUD за допомогою репозиторіїв.
- Конструктор запитів: Включає потужний конструктор запитів для складних запитів.
- Міграції: Вбудована підтримка міграцій бази даних.
Приклад коду:
Опис сутності
import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from 'typeorm';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@Column({ unique: true })
email: string;
@OneToMany(() => Post, (post) => post.author)
posts: Post[];
}
Запит даних
import { getRepository } from 'typeorm';
import { User } from './entities/User';
const userRepository = getRepository(User);
async function getUsers() {
const users = await userRepository.find({ relations: ['posts'] });
console.log(users);
}
Коли використовувати TypeORM:
- Вам потрібен універсальний ORM з потужним набором функцій.
- Ви віддаєте перевагу визначенню сутностей за допомогою декораторів.
- Ви хочете контролювати сирі запити за допомогою конструктора запитів.
3. Sequelize
Sequelize — це зрілий і широко використовуваний ORM для Node.js. Відомий своєю гнучкістю та потужним набором функцій, він надає простий спосіб керувати SQL базами даних в JavaScript застосунках.
Ключові функції:
- Підтримка кількох баз даних: Працює з PostgreSQL, MySQL, MariaDB, SQLite та іншими.
- Моделі та асоціації: Визначає схеми бази даних та зв'язки за допомогою моделей.
- Конструктор запитів: Дозволяє програмно будувати складні запити.
- Хуки: Надає хуки життєвого циклу для кастомної логіки під час операцій.
- Міграції: Включає інструменти для керування міграціями бази даних.
Приклад коду:
Опис моделі
import { Sequelize, DataTypes, Model } from 'sequelize';
const sequelize = new Sequelize('sqlite::memory:');
class User extends Model {}
User.init(
{
name: DataTypes.STRING,
email: { type: DataTypes.STRING, unique: true },
},
{ sequelize, modelName: 'User' }
);
Запит даних
async function fetchUsers() {
const users = await User.findAll();
console.log(users);
}
Коли використовувати Sequelize:
- Якщо вам потрібен зрілий, перевірений ORM.
- Якщо у вашому проєкті є команда, яка знайома з Sequelize.
- Якщо ви віддаєте перевагу простому підходу на JavaScript.
Що таке Drizzle Studio?
Drizzle Studio — це візуальна панель управління (UI dashboard), яка дозволяє розробникам переглядати та керувати своїми SQL базами даних безпосередньо в проєкті. Вона спрощує взаємодію з базою даних, пропонуючи інтуїтивно зрозумілий інтерфейс для розробників.
Ключові функції:
- Візуалізація даних: Переглядайте всі таблиці, рядки та зв'язки вашої бази даних одним поглядом.
- Виконання запитів: Виконуйте SQL запити безпосередньо з панелі управління.
- Інтерактивний UI: Виконуйте операції CRUD (Створення, Читання, Оновлення, Видалення) без необхідності писати сирий SQL.
- Локальний доступ: Панель доступна за адресою
https://local.drizzle.studio
, що забезпечує безпеку даних та зручність використання під час розробки. - Прекрасний UI: Чистий та адаптивний дизайн, який покращує досвід роботи розробника.
Чому варто використовувати Drizzle Studio?
- Економія часу: Немає потреби використовувати окремий клієнт бази даних або запам'ятовувати складні команди CLI.
- Кращий дебагінг: Швидко перевіряйте зміни в базі даних та виправляйте проблеми.
- Співпраця між розробниками: Забезпечує спільне візуальне розуміння бази даних для команд.
- Безпечно і локально: Оскільки воно працює локально, ваші взаємодії з базою даних залишаються в межах середовища розробки.
Налаштування Drizzle Studio
1. Встановлення Drizzle Studio
Для інтеграції Drizzle Studio з вашим проєктом виконайте наступні кроки:
npm install drizzle-studio
текст перекладу
Configure Drizzle Studio
Переконайтесь, що у вашому проєкті є конфігурація Drizzle ORM. Drizzle Studio безшовно інтегрується з Drizzle ORM. Наприклад, якщо ви використовуєте SQLite:
import { drizzle } from 'drizzle-orm/sqlite3';
import sqlite3 from 'sqlite3';
// Ініціалізація бази даних SQLite
const sqlite = new sqlite3.Database('./db.sqlite');
export const db = drizzle(sqlite);
```
3. Запуск Drizzle Studio
Запустіть наступну команду, щоб розпочати роботу з Drizzle Studio:
npx drizzle-studio start
Drizzle Studio стартує локально і буде доступний за адресою https://local.drizzle.studio
.
Огляд функцій Drizzle Studio
Коли Drizzle Studio буде запущено, ви зможете виконувати різні дії:
1. Перегляд таблиць і зв'язків
Drizzle Studio автоматично виявляє схему вашої бази даних і відображає всі таблиці, стовпці та зв'язки. Це дає вам миттєвий огляд структури даних.
2. Виконання SQL запитів
Використовуйте вбудований редактор запитів для написання та виконання SQL команд, незалежно від того, чи вони прості чи складні. Приклад:
SELECT * FROM users WHERE email LIKE '%@example.com';
Результати відображаються відразу в організованому форматі.
3. Операції CRUD
Взаємодійте безпосередньо з вашими даними:
- Додавання рядків: Вставляйте нові записи без написання SQL.
- Редагування рядків: Оновлюйте існуючі записи безпосередньо.
- Видалення рядків: Видаляйте записи одним кліком.
4. Пошук та фільтрація
Швидко шукайте або фільтруйте дані в таблицях, щоб знайти необхідну інформацію.
Приклад робочого процесу з Drizzle Studio
- Запуск локального сервера:
npx drizzle-studio start
Відкриття панелі керування: Перейдіть за адресою https://local.drizzle.studio
у вашому браузері.
Огляд вашої бази даних:
- Переглядайте всі таблиці, рядки та зв'язки.
- Виконуйте запити для отримання даних.
- Змінюйте дані безпосередньо з UI.
Збереження запитів: Зберігайте часто використовувані запити для повторного використання під час розробки чи налагодження.
Переваги Drizzle Studio
- Підвищення продуктивності розробника: Менше часу на перемикання між інструментами та більше часу на створення функцій.
- Покращене розуміння бази даних: Візуальне подання вашої схеми допомагає як новачкам, так і досвідченим розробникам.
- Оптимізоване налагодження: Швидко перевіряйте оновлення бази даних або виправляйте проблеми.
- Співпраця в команді: Забезпечує спільне, візуальне розуміння бази даних для команд, що працюють разом.
Висновок
Drizzle ORM надає тонку, типізовану абстракцію над SQL, що робить його ідеальним для проєктів, де необхідні як простота, так і контроль. В комбінації з Next.js він дозволяє розробникам писати потужні та підтримувані застосунки з безшовною інтеграцією на бекенді.
Використовуючи Drizzle ORM, ви можете легко писати складні SQL запити, забезпечуючи типову безпеку та покращуючи якість коду.
Перекладено з: Nextjs With Drizzle