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

Модуль работы с БД: различия между версиями

Материал из wiki.chemsoft.ru
Новая страница: «==Общие сведения== Принцип работы: модуль подключается к БД по connectionString из реестра Windows. Большинство операций асинхронные. Модуль поддерживает работу с СУБД: Access, MS SQL, Oracle и Postgres SQL: *для подключения к Access и к Postres используется модуль <code>@chemsoft/odbc</code>; *для п...»
 
Строка 10: Строка 10:
Можно запросить клиент для необходимой СУБД вручную:
Можно запросить клиент для необходимой СУБД вручную:


 
<syntaxhighlight lang="javascript">
const {AccessClient, MssqlClient, OracleClient} = require('@chemsoft/db')
const {AccessClient, MssqlClient, OracleClient} = require('@chemsoft/db')


Строка 17: Строка 17:
const oracle = new OracleClient(`connection string`)
const oracle = new OracleClient(`connection string`)
const oracle = new PostgresClient(`connection string`)
const oracle = new PostgresClient(`connection string`)
</syntaxhighlight>
Можно в полностью автоматическом режиме получить клиент для нужной СУБД, получая при этом универсальное решение для любой БД:
Можно в полностью автоматическом режиме получить клиент для нужной СУБД, получая при этом универсальное решение для любой БД:



Версия от 05:25, 30 декабря 2025

Общие сведения

Принцип работы: модуль подключается к БД по 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>