Я впервые столкнулся с термином ORM (объектно-реляционное отображение) во время моего трехмесячного пребывания в Bootcamp Land в Lighthouse Labs. Как всегда, я инстинктивно зашел в Википедию, чтобы узнать больше об этом новом инструменте… И был удивлен, увидев, что там нет перечисленных JavaScript ORM! Чего ждать? Мы говорим о JavaScript, языке, в котором есть основа для чего угодно?

Итак, быстрый поиск в Google показал мне, что действительно существует множество ORM, используемых с Node.js (и, следовательно, совместимых с JavaScript). И есть довольно много мнений о том, какие из них лучше использовать.

Простой поиск на GitHub для ORM, отфильтрованного с помощью JavaScript, выдал несколько одинаковых имен при упорядочении по количеству звезд.

Для краткости (и чтобы избежать этой исследовательской кроличьей норы в целости и сохранности) я решил изучить три ORM, которые являются общими для обоих списков: Sequelize, Bookshelf, Objection.js.

Sequelize (23,5 тыс. звезд на GitHub)

Согласно репозиторию GitHub, Sequelize

Простой в использовании ORM с несколькими диалектами SQL для Node.js.

Это пакет на основе обещаний, который поддерживает Postgres, MySQL, MariaDB, SQLite и Microsoft SQL Server. Тот факт, что он основан на промисах (что характерно не для всех JS ORM), обеспечивает больший контроль над исключениями и неожиданными результатами. Он также обеспечивает поддержку нескольких диалектов, что устраняет проблемы с различиями между различными реализациями SQL.

Пользователи сообщают, что его легко использовать и освоить, он эффективен и легко настраивается. С другой стороны, их документация не считается интуитивно понятной или легкой для понимания. Интернет-сообщество частично компенсирует это, предлагая множество ресурсов и примеров кода.

Другие минусы, которые люди упоминают, это то, что ему не хватает поддержки NoSQL и что он иногда генерирует сложные запросы (что, кажется, является общей проблемой с ORM в целом).

Однако команда, разрабатывающая его, достаточно активна — их последний релиз был 4 месяца назад. А со в среднем 472 000 загрузок в неделю и 258 000 пользователей они, кажется, занимают удобное место среди лучших ORM NodeJS.

Он выпущен как пакет npm, поэтому работает

$ npm i sequelize

подготовит вас к действию в кратчайшие сроки.

Книжная полка (6,1 тыс. стартов на GitHub)

Их страница GitHub описывает пакет как

Простой ORM Node.js для PostgreSQL, MySQL и SQLite3, созданный поверх Knex.js.

Он имеет как основанные на Promise, так и традиционные интерфейсы обратного вызова с поддержкой PostgreSQL, MySQL и SQLite3.

Их веб-сайт рекламирует экономичный объектно-реляционный преобразователь, который позволяет легко переключаться на интерфейс Knex всякий раз, когда требуется пользовательский запрос. Асинхронная сборка, предлагаемая этим пакетом, делает его более привлекательным для разработчиков, стремящихся лучше обрабатывать результаты своих запросов.

Однако у Bookshelf, похоже, нет полной поддержки ES6, и пользователи жалуются, что он плохо работает с новыми классами и их функциями. Несмотря на то, что у проекта менее активная команда сторонников, тем не менее существует неплохая коллекция плагинов сообщества.

Хотя он и не дотягивает до показателей Sequelize, с 69 тысячами загрузок в неделю и 21,7 тысячами пользователей, он по-прежнему считается хорошей альтернативой и часто упоминается в онлайн-списках.

Он выпущен как NPMpackage, но не запускает свои зависимости автоматически, поэтому для его работы вам необходимо установить и Knex, и Bookshelf:

$ npm install knex
$ npm install bookshelf

Затем библиотека Bookshelf вызывается путем передачи инициализированного экземпляра клиента Knex:

// more examples for the connection can be found in the Knex docs
const knex = require('knex')({
  client: 'mysql',
  connection: {
    host     : '127.0.0.1',
    user     : 'your_database_user',
    password : 'your_database_password',
    database : 'myapp_test',
    charset  : 'utf8'
  }
});
const bookshelf = require('bookshelf')(knex);

Objection.js (5,8 тыс. звезд на GitHub)

Другой ORM, построенный поверх Knex, Objection.js, согласно их GitHub,

ORM для Node.js, который стремится не мешать вам и максимально упрощает использование всей мощности SQL и базового механизма базы данных, в то же время делая обычные вещи простыми и приятными.

Все базы данных, поддерживаемые Knex, поддерживаются Objection.js, включая Postgres, MSSQL, MySQL, MariaDB, SQLite3, Oracle и Amazon Redshift.

Поскольку он предлагает официальную поддержку TypeScript и дополнительную проверку схемы JSON, это предпочтительный вариант для некоторых пользователей, которые говорят, что он прост в использовании и имеет первоклассную документацию.

По общему мнению, Objection.js более легкий, чем другие решения, доступные в настоящее время для Node. Будучи ближе к построителю запросов, чем к ORM, он предлагает баланс между предсказуемостью и пользовательскими запросами. И хотя вам нужно создать свою собственную схему и миграции, вы все равно получите логику связи/вставки/проверки, которую вы ищете в ORM.

Он доступен как установка NPM или Yarn:

$ npm install objection knex
$ yarn add objection knex
//or install the alpha/beta/RC version if you're feeling adventurous :)
npm install objection@next

Хотя на сегодняшний день у него всего 5,4 тыс. пользователей, он быстро догоняет 40 тыс. загрузок в неделю и самую последнюю (8 января 2021 г.) версию.

Так что не расстраивайтесь из-за того, что Википедия не проявляет интереса к ORM JavaScript, доступно довольно много вариантов, в зависимости от того, насколько вы хотите абстрагировать базу данных и сколько вашего собственного языка по сравнению с SQL вы хотите писать на ваш проект. Кажется, есть инструмент на любой вкус.

Лично меня покорила поддержка Objection.js со стороны сообщества, и я обязательно попробую его в какой-то момент, как только почувствую себя достаточно уверенно в своих навыках SQL. Потому что, в конце концов, абстрагирование может быть очень полезным, когда у вас сжатые сроки для реализации проекта. В то же время это может быть вредно (особенно для младших разработчиков вроде меня) в том смысле, что лишает возможности экспериментировать и более глубоко изучать определенные концепции/использования.

Ссылки («лучшие» статьи):

21 самая популярная ORM-библиотека Node.js SQLite

13 лучших ORM для JavaScript на 2021 год

11 лучших ORM, построителей запросов и библиотек баз данных Node.js в 2020 году

12 лучших ORM для Node.js