Привет, друзья! В этой серии из 2 статей я хочу поделиться с вами своими заметками о Prisma. Prisma — это современное (продвинутое) объектно-реляционное отображение (Object-Relational Mapping, ORM) для Node.js и TypeScript. Проще говоря, Prisma — это инструмент, позволяющий работать с реляционными (PostgreSQL, MySQL, SQL Server, SQLite) и нереляционной (MongoDB) базами данных с помощью JavaScript или TypeScript без использования SQL (хотя такая возможность имеется). Вторая часть. Если вам это интересно, прошу под кат. Создаем директорию, переходим в нее и инициализируем Node.js-проект: Устанавливаем Prisma в качестве зависимости для разработки: Инициализируем проект Prisma: Это приводит к генерации файлов prisma/schema.prisma и .env. В файле .env содержится переменная DATABASE_URL, значением которой является путь к (адрес) БД. Файл schema.prisma мы рассмотрим позже. Интерфейс командной строки (Command line interface, CLI) Prisma предоставляет следующие основные возможности (команды): Это приводит к созданию БД при ее отсутствии, генерации файла prisma/migrations/migration_name.sql, выполнению инструкции из этого файла (синхронизации БД со схемой) и генерации (регенерации) клиента (prisma generate). Данная команда должна выполняться после каждого изменения схемы. Подробнее о CLI можно почитать здесь. В файле schema.prisma мы видим такие строки: Для работы со схемой удобно пользоваться расширением Prisma для VSCode. Соответствующий раздел в файле settings.json должен выглядеть так: Определим в схеме модели для пользователя (User) и поста (Post): Вот что мы здесь видим: Допустимыми в названиях полей являются следующие символы: [A-Za-z][A-Za-z0-9_]*. Атрибут @db позволяет использовать типы данных, специфичные для одной или нескольких БД. Кроме упомянутых выше, в схеме можно использовать следующие атрибуты: Подробнее о схеме можно почитать здесь. Атрибут @relation указывает на существование отношений между моделями (таблицами). Он принимает следующие параметры: В приведенной выше схеме полями, указывающими на существование отношений между моделями User и Post, являются поля posts и author. Эти поля существуют только на уровне Prisma, в БД они не создаются. Скалярное поле author_id также существует только на уровне Prisma — это внешний ключ (FOREIGN KEY), соединяющий Post с User. Как известно, существует 3 вида отношений: Атрибут @relation является обязательным только для отношений 1-1 и 1-n. Предположим, что в нашей схеме имеются такие модели: Вот что мы здесь видим: Подробнее об отношениях можно почитать здесь. Импортируем и создаем экземпляр клиента Prisma: Иногда может потребоваться делать так: findUnique позволяет извлекать единичные записи по идентификатору или уникальному полю. Сигнатура Модификатор ? означает, что поле является опциональным. Пример findFirst возвращает первую запись, соответствующую заданному критерию. Сигнатура Пример findMany возвращает все записи, соответствующие заданному критерию. Сигнатура Пример create создает новую запись. Сигнатура Пример update обновляет существующую запись. Сигнатура Пример upsert обновляет существующую или создает новую запись. Сигнатура Пример delete удаляет существующую запись по идентификатору или уникальному полю. Сигнатура Пример createMany создает несколько записей с помощью одной транзакции (о транзакциях мы поговорим отдельно). Пример Пример updateMany обновляет несколько существующих записей за один раз и возвращает количество (sic) обновленных записей. Сигнатура Пример deleteMany удаляет несколько записей с помощью одной транзакции и возвращает количество удаленных записей. Сигнатура Пример count возвращает количество записей, соответствующих заданному критерию. Сигнатура Пример aggregate выполняет агрегирование полей. Сигнатура Пример groupBy выполняет группировку полей. Сигнатура Пример В следующем примере мы выполняем группировку по country / city, где среднее значение profileViews превышает 100, и возвращаем общее количество (_sum) profileViews для каждой группы. Запрос также возвращает количество всех (_all) записей в каждой группе и все записи с не null значениями поля city в каждой группе: Пожалуй, это все, о чем я хотел рассказать вам в первой части. Благодарю за внимание и happy coding!  JavaScript Developer