Перейти к содержанию

Модуль работы с БД

Принцип работы: модуль подключается к БД по connectionString из реестра Windows. Большинство операций асинхронные.

Модуль поддерживает работу с СУБД: Access, MS SQL, Oracle и Postgres SQL. Для подключения к Access и к Postres используется модуль @chemsoft/odbc. Для подключения к MS SQL используется модуль mssql/msnodesqlv8. Для подключения к Oracle используется модуль @chemsoft/oracledb.

Начало работы

Можно запросить клиент для необходимой СУБД вручную:

const {AccessClient, MssqlClient, OracleClient} = require('@chemsoft/db')

const access = new AccessClient(`connection string`)
const mssql = new MssqlClient(`connection string`)
const oracle = new OracleClient(`connection string`)
const oracle = new PostgresClient(`connection string`)

Можно в полностью автоматическом режиме получить клиент для нужной СУБД, получая при этом универсальное решение для любой БД:

const { getChemicClient } = require('@chemsoft/db')

const client = getChemicClient() 

Такой трюк работает, благодаря общему интерфейсу.

client.connect()

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

async connect(): Promise<void>

client.disconnect()

Производит отключение от БД в явном виде, таким образом не будет создаваться лишних соединений с БД, на одного пользователя будет только одно подключение. Необходимо вызвать в конце потока исполнения скрипта.

async disconnect(): Promise<void>

client.execute()

Выполняет запрос. В зависимости от типа БД ответ может различаться.

IExecuteResult это интерфейс для максимально общего описания возвращаемых значений. Содержит массив записей и метаданные.

interface IExecuteResult {
  records: Array<{ [columnName: string]: any }>;
  meta: {
    rowsAffected?: number;
  }
}
Тип получаемых параметров:

type QueryParameter = null |
                      number |
                      boolean |
                      string |
                      Date |
                      { type: 'date' | 'time'; value: Date }

query: string текст SQL запроса parameters?: QueryParameter[] массив параметров запроса, в тексте запроса можно ставить символ ?, на его место будет подставляться правильно отформатированный параметр

execute(query: string, parameters?: QueryParameter[]): Promise<IExecuteResult>

client.executeScalar()

Выполняет запрос и возвращает одно скалярное значение (даже если может быть возвращено несколько колонок). Если возвращено несколько записей и колонок, то возвращает данные из первой записи и первой колонки.

query: string текст SQL запроса parameters?: QueryParameter[] массив параметров запроса, в тексте запроса можно ставить символ ?, на его место будет подставляться правильно отформатированный параметр

executeScalar(query: string, parameters?: QueryParameter[]): Promise<any>

client.requireFromDatabase()

Выполняет запрос и срабатывает как require(), но код модуля получает из БД. В основном используется в планировщике.

requireFromDatabase(name: string): Promise<any>