Все чаще наталкиваюсь на обсуждения о Prisma — современном ORM, который интегрируется с Node.js и TypeScript

Эта библиотека упрощает создание и управление базами данных Node.js, полностью поддерживая TypeScript с автоматической генерацией типов
Определение схемы легко читается людьми — никакой головной боли. Как именно это работает, вы увидите в следующих разделах
Кроме того, ORM хорошо интегрируется с Next.js, GraphQL, Nest.js, Express.js, Apollo и Hapi
Подводя итог: Prisma — это современный ORM, который отлично сочетается со всеми популярными технологическими стеками
Именно поэтому я решил попробовать его и заменить им свою предыдущую библиотеку управления базами данных — TypeORM
«Prisma помогает разработчикам приложений работать быстрее и допускать меньше ошибок благодаря open source ORM для PostgreSQL, MySQL и SQLite.» — главная страница Prisma
- Создаём базу данных Twitter с Node.js, Prisma и SQLite
- Предварительные требования
- Настройка базового проекта
- Создание первой модели — User
- Создание второй модели — Tweet
- Как создать миграцию базы данных в Prisma
- Как запустить и протестировать проект Node.js с SQLite
- Что делать дальше
- Частые вопросы по Prisma и SQLite
Создаём базу данных Twitter с Node.js, Prisma и SQLite
Twitter с помощью Node, Prisma и SQLite
Перейдем к практике и создадим базу данных Node.js с Prisma, используя SQLite для простоты
SQLite — это автономный движок баз данных. Вам не нужно настраивать отдельную базу данных на вашем компьютере — проект будет функционировать независимо, если следовать инструкции
Если в будущем вы захотите использовать Prisma с PostgreSQL, обратитесь к руководству по созданию базы данных PostgreSQL с помощью Docker-Compose
Предварительные требования
Node.js версии 12.2 или выше
Прежде чем начать, убедитесь, что на вашем устройстве установлена версия Node.js 12.2 или выше. Если необходимо, обновите Node перед переходом к следующему шагу
Примечание: чтобы проверить версию Node.js, введите node -v в терминале. Вывод покажет установленную версию
Базовые знания SQL
Хотя я придерживаюсь простого подхода, полезно иметь базовые знания SQL для полного понимания процесса
Примечание: быть экспертом не нужно. Достаточно основ — например, умения создать таблицу и выполнить несколько запросов
По этой теме полезно отдельно посмотреть EXPLAIN QUERY PLAN: план выполнения SQL-запроса в SQLite, чтобы расширить контекст и сравнить подходы
По этой теме полезно отдельно посмотреть Создание Flutter-приложения с SQLite, BLoC и Streams, чтобы расширить контекст и сравнить подходы
Настройка базового проекта
Сначала создайте новую папку для проекта и перейдите в неё:
$ mkdir minimalistic-twitter
$ cd minimalistic-twitter
Затем установите все обязательные зависимости — TypeScript и Prisma:
$ npm init -y
$ npm install prisma typescript ts-node @types/node --save-dev
$ npm install @prisma/client
После этого в репозитории должны появиться папка node_modules и файл package.json
Прежде чем инициализировать Prisma, последним шагом настройки является создание конфигурации TypeScript в корне репозитория. Создайте файл tsconfig.json и вставьте в него следующую конфигурацию:
{ "compilerOptions": { "sourceMap": true, "outDir": "dist", "strict": true, "lib": ["esnext"], "esModuleInterop": true }
}
Готово! Теперь можно подключить Prisma к проекту. В папке minimalistic-twitter выполните следующую команду, чтобы вывести справку Prisma:
$ npx prisma
Последний шаг перед созданием минималистичного приложения Twitter — инициализация конфигурации базы данных. Используем команду init с параметром --datasource-provider, чтобы указать тип базы данных. Без этого параметра init по умолчанию создаст базу данных PostgreSQL:
$ npx prisma init --datasource-provider sqlite
Когда команда завершит выполнение, в репозитории должны появиться файл .env и папка prisma с файлом schema.prisma внутри
Файл schema.prisma содержит все инструкции для подключения к базе данных. Позже в нём также будут инструкции для генерации таблиц
Файл .env содержит переменные окружения, необходимые для работы проекта. Для Prisma единственной переменной является DATABASE_URL, значение которой установлено в ./dev.db
Файл dev.db будет автономным файлом базы данных
Если структура вашего проекта совпадает с описанной — поздравляю, проект готов к работе! 🎉
Создание первой модели — User
Наша базовая база данных Twitter будет состоять из двух основных сущностей:
- сущность пользователя с информацией о нём и его твитами
- сущность твита с содержимым и ссылкой на автора
Начнём с сущности пользователя. Каждая запись имеет:
- идентификатор (
id) - уникальный email (два пользователя не могут иметь одинаковый)
- имя пользователя (
username) - список твитов
В Prisma новая схема (модель) определяется в файле schema.prisma с помощью инструкции model. Воспроизведите её после инструкции подключения к базе данных:
// После инструкции подключения к базе данных
model User { // Переменная `id`, тип `Int` (число) // Декораторы Prisma: // - @id (это ID) // - @default(autoincrement()) (значение автоинкрементируется) id Int @id @default(autoincrement())
// Переменная `email`, тип `String` // Декоратор @unique — два пользователя не могут иметь одинаковый email email String @unique
// Переменная `username`, тип `String` username String
// Переменная `tweets`, тип `Tweet[]` (отношение один-ко-многим) // Каждый пользователь может иметь от 0 до бесконечного числа твитов tweets Tweet[]
}
Как вы могли заметить, модели Tweet у нас пока нет — это следующий шаг
Создание второй модели — Tweet
Теперь, когда у нас есть пользователи, нужны твиты. Следуем тому же процессу, что и раньше, но для сущности Tweet
Каждая запись имеет:
- идентификатор (
id) - дату создания
- текст
userId(автор твита)
Добавьте сущность после объявления модели User в файле schema.prisma:
model Tweet { id Int @id @default(autoincrement()) createdAt DateTime @default(now()) text String userId Int user User @relation(fields: [userId], references: [id])
}
Как создать миграцию базы данных в Prisma
Прежде чем использовать базу данных, её нужно сгенерировать. Для этого воспользуемся ещё одной командой Prisma CLI, которая позволяет создавать миграции (migrations)
Из документации по команде migrate:
«Prisma Migrate — это императивный инструмент миграции схемы базы данных, который позволяет поддерживать синхронизацию схемы базы данных со схемой Prisma по мере её развития и сохранять существующие данные.» — документация Prisma migrate
Идея состоит в том, чтобы зафиксировать первую реализацию базы данных. Введите команду ниже в терминале:
npx prisma migrate dev --name initialize
Примечание: после параметра --name можно указать любое имя. Имя миграции помогает запомнить, какие изменения были внесены
Если команда выполнена успешно, все инструкции в schema.prisma верны. ✅
Структура проекта теперь должна содержать папку с миграцией (за исключением хэша миграции, который будет уникальным)
Примечание: в файле migration.sql вы найдёте SQL-запросы для генерации базы данных
База данных готова! 🚀 Пришло время попробовать её в деле — добавить пользователей и дать им возможность твитить
Как запустить и протестировать проект Node.js с SQLite
Проверим, смогут ли пользователи твитить. Создадим файл index.ts в корне репозитория и напишем в него несколько инструкций
Сначала импортируем и инициализируем подключение к базе данных. На основе документации Prisma Quickstart создаём переменную prisma для взаимодействия с базой данных и функцию для тестового кода:
import { PrismaClient } from "@prisma/client";
const prisma = new PrismaClient();
async function main() {}
main() .catch((e) => { throw e; }) .finally(async () => { await prisma.$disconnect(); });
Теперь заполним функцию main инструкциями:
// Создаём новый твит и связываем его с новым пользователем const firstTweet = await prisma.tweet.create({ data: { text: "Hello world!", userId: newUser.id, }, }); console.log("First tweet:"); console.log(firstTweet);
// Снова получаем пользователя (по уникальному email) // и запрашиваем его твиты одновременно const newUserWithTweets = await prisma.user.findUnique({ where: { email: "hello@herewecode.io", }, include: { tweets: true }, }); console.log("User object with Tweets:"); console.dir(newUserWithTweets); }
Примечание: если хотите узнать о других доступных инструкциях, обратитесь к странице CRUD в документации Prisma
Пришло время запустить index.ts. Откройте package.json и найдите раздел scripts. Добавьте команду для запуска проекта с помощью ts-node:
"scripts": { "dev": "ts-node ./index.ts", "test": "echo \"Error: no test specified\" && exit 1"
}
Затем в терминале введите:
$ npm run dev
Примечание: эта команда запускает скрипт dev из package.json
Это работает! Первый пользователь и первый твит успешно созданы. 👏
Что делать дальше
Теперь, когда первая база данных с помощью Prisma настроена, можно добавить в неё дополнительные функции. На моём опыте следующие шаги дают хорошую практику:
- добавить больше информации в сущность
User(день рождения, адрес, биография и т.д.) - добавить систему лайков: каждый твит может иметь лайки, каждый пользователь — список понравившихся твитов
Полный код примера доступен на GitHub: Prisma SQLite example
Частые вопросы по Prisma и SQLite
Чем Prisma отличается от TypeORM? Prisma автоматически генерирует типы TypeScript на основе схемы, а определение моделей в schema.prisma читается значительно проще, чем декораторы TypeORM. Именно это стало для меня главным аргументом в пользу перехода
Почему для начала выбран SQLite, а не PostgreSQL? SQLite — автономный движок: не нужно устанавливать и настраивать отдельный сервер базы данных. Это делает его идеальным для знакомства с Prisma. Для продакшена или более сложных проектов лучше использовать PostgreSQL или MySQL
Что такое миграция в Prisma и зачем она нужна? Миграция — это зафиксированное изменение схемы базы данных. Prisma Migrate синхронизирует схему в schema.prisma с реальной структурой базы данных и сохраняет историю изменений в виде SQL-файлов
Можно ли использовать Prisma без TypeScript? Да, Prisma работает и с обычным JavaScript. Однако TypeScript раскрывает главное преимущество библиотеки — автоматически сгенерированные типы для всех сущностей, что существенно снижает количество ошибок
Как добавить новое поле в существующую модель? Достаточно добавить поле в соответствующую модель в файле schema.prisma и снова выполнить npx prisma migrate dev --name название_изменения. Prisma сгенерирует новую миграцию и обновит базу данных



