Работаем с SQL Server в Node.js (с использованием SQL запросов)

Node.Js поддерживает работу со всеми популярными системами управления базами данных. Microsoft SQL Server не исключение.

В репозитории npm существует целый ряд пакетов, которые позволяют работать с этой СУБД. Однако все их можно условно разделить на две большие группы в зависимости от реализуемого подхода.

  • Непосредственная работа с базой данных c использованием SQL запросов;

  • Сопоставление объектной модели и структуры базы данных посредство ORM.

В данной статье речь пойдёт о первом подходе.

Установка клиента для SQL Server

Для того чтобы выполнить запрос к базе данных SQL Server в Node.js существует целый ряд библиотек. Мы воспользуемся библиотекой @frangiskos/mssql, которая основана на node-mssql и предоставляет достаточно простой интерфейс для работы.

Библиотека имеет открытый исходный код, который доступен на GitHub (https://github.com/frangiskos/mssql).

Установить её можно при помощи npm следующей командой:

Подключение к базе данных

Чтобы подключиться к базе данных необходимо подключить библиотеку к проекту и создать объект SqlConfig, в котором описаны параметры подключения.

Ниже приведён пример указанных операций:

Далее нужно передать объект SqlConfig в метод init объекта sql.

Библиотека @frangiskos/mssql работает с SQL Server по протоколу TCP. Поэтому предварительно убедитесь, что для экземпляра SQL Server, к которому вы планируете подключиться включен протокол TCP и открыты соответствующие порты.

Если подключение завершено успешно, можно выполнять запросы к базе данных при помощи метода query, но о нём позже.

Так как метод init ничего не возвращает, обработать ошибку подключения можно только при помощи блока try-catch.

Запрос на выборку

Запрос на выборку данных выполняется при помощи метода query/ Этот метод обычно принимает как минимум один параметр – строку с текстом запроса. Остальное — параметры запроса (о них мы поговорим позже).

Ниже показан пример, получения всех записей из таблицы:

Метод query возвращает Promise. Поэтому данные мы можем получить только в методе then или при помощи async/await.

Записи из таблицы возвращаются в виде JSON массива, где каждый элемент представляет собой JSON объект с полями соответствующими структуре таблицы.

Например, для таблицы, которая включает поля id (целое число) и testValue (nvarchar), массив с результатами будет выглядеть приблизительно так:

Запрос без выборки данных

Если запрос не предполагает получения данных из базы (UPDATE, INSERT, CREATE и т. д.), он выполняется аналогичным образом. Единственное отличие состоит только в том, что в этом случае нет необходимости обрабатывать возвращаемые данные в приложении. Поэтому, метод then можно использовать только для контроля успешного выполнения запроса.

Ниже показан пример запроса на выполнение хранимой процедуры:

Как мы видим при помощи библиотеки @frangiskos/mssql можно спокойно работать с SQL Server используя синтаксис Transact-SQL.

В приведённом примере есть один очень серьёзный подвох.

Значение входного параметра хранимой процедуры передаётся непосредственно в строке запроса, что чревато далеко идущими последствиями. Поэтому настоятельно рекомендуется в подобных случаях применять запросы с параметрами (параметрические запросы), речь о которых пойдёт ниже.

Параметрический запрос

Библиотека @frangiskos/mssql поддерживает параметрические запросы.

Для этой цели предусмотрен специальный синтаксис.

Параметры в тексте запроса обозначаются как @P и далее номер параметра (обязательно), начиная с 1.

Обратите внимание, что подобные имена параметров являются заерезервированными.

Значения параметров запроса передаются как параметры метода query (начиная со второго параметра, первый всегда строка запроса).

Далее представлен предыдущий пример, который был изменён для использования параметрического запроса.

Метод query, ранее принимавший только один параметр, теперь принимает два. Строку запроса и значение параметра.

Количество используемых параметров не ограничено.

Сопоставление параметров запроса их значениям осуществляется слева направо. То есть, второй параметр метода query — @P1, третий — @P2, четвёртый — @P3 и т. д.

Например, такой запрос к рассмотренной ранее тестовой таблице вернёт не все пять значений, а только два.

Результат будет уже таким:

Специализированные методы

В принципе, изложенное выше, это всё, что необходимо знать для успешной работы с SQL Server в Node.js при помощи @frangiskos/mssql. Но, возможности библиотеки этим не ограничиваются.

Есть ещё два метода, которые вызываются аналогично query, но предназначены для частных случаев и потому используются значительно реже. Однако эти методы могут существенно упростить вам работу.

Первый из них queryOne — полный аналог query, но возвращает только первую из выбранных записей. Этот метод избавляет от необходимости использовать «TOP 1» в SQL запросах.

Второй insertReturnIdentity, предназначен для выполнения вставки данных в таблицу с возвратом идентификатора добавленной записи в случае успеха. Этот метод возвращает Promise. Поэтому, значение идентификатора доступно только в методе then или с использованием async/await.

Но, даже несмотря на это роль метода insertReturnIdentity переоценить сложно, так как благодаря ему полностью отпадает потребность поиска только, что добавленной записи.

Также стоит обратить внимание на методы q, q1 и ii.

Эти методы по сути являются псевдонимами для query, queryOne и insertReturnIdentity соответственно. Они позволяют сократить объём кода за счёт краткости. Но, стоит ли приносить качество кода в жертву подобной «оптимизации» уже решать вам.

На этом, мы завершаем рассмотрение библиотеки @frangiskos/mssql.

Конечно данная библиотека не поражает разнообразием классов и методов, но за то она содержит лишь то, что действительно необходимо для работы и предоставляет к этому удобный доступ, что нередко гораздо ценнее.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *