Модуль работы с БД: различия между версиями
Sidminik (обсуждение | вклад) |
Sidminik (обсуждение | вклад) |
||
| Строка 21: | Строка 21: | ||
Можно в полностью автоматическом режиме получить клиент для нужной СУБД, получая при этом универсальное решение для любой БД: | Можно в полностью автоматическом режиме получить клиент для нужной СУБД, получая при этом универсальное решение для любой БД: | ||
<syntaxhighlight lang="javascript"> | |||
const { getChemicClient } = require('@chemsoft/db') | const { getChemicClient } = require('@chemsoft/db') | ||
const client = getChemicClient() | const client = getChemicClient() | ||
</syntaxhighlight> | |||
Такой трюк работает, благодаря общему интерфейсу. | Такой трюк работает, благодаря общему интерфейсу. | ||
client.connect() | ===client.connect()=== | ||
Производит подключение к БД. Почему не реализовано в конструкторе? Для того, чтобы реализовать ленивый запрос зависимостей, таким образом, подключены будут только используемые в текущий момент пакеты для подключения к БД. | Производит подключение к БД. Почему не реализовано в конструкторе? Для того, чтобы реализовать ленивый запрос зависимостей, таким образом, подключены будут только используемые в текущий момент пакеты для подключения к БД. | ||
async connect(): Promise<void> | |||
===client.disconnect()=== | |||
client.disconnect() | |||
Производит отключение от БД в явном виде, таким образом не будет создаваться лишних соединений с БД, на одного пользователя будет только одно подключение. Необходимо вызвать в конце потока исполнения скрипта. | Производит отключение от БД в явном виде, таким образом не будет создаваться лишних соединений с БД, на одного пользователя будет только одно подключение. Необходимо вызвать в конце потока исполнения скрипта. | ||
async disconnect(): Promise<void> | |||
===client.execute()=== | |||
client.execute() | |||
Выполняет запрос. В зависимости от типа БД ответ может различаться. | Выполняет запрос. В зависимости от типа БД ответ может различаться. | ||
| Строка 61: | Строка 63: | ||
execute(query: string, parameters?: QueryParameter[]): Promise<IExecuteResult> | execute(query: string, parameters?: QueryParameter[]): Promise<IExecuteResult> | ||
client.executeScalar() | |||
===client.executeScalar()=== | |||
Выполняет запрос и возвращает одно скалярное значение (даже если может быть возвращено несколько колонок). Если возвращено несколько записей и колонок, то возвращает данные из первой записи и первой колонки. | Выполняет запрос и возвращает одно скалярное значение (даже если может быть возвращено несколько колонок). Если возвращено несколько записей и колонок, то возвращает данные из первой записи и первой колонки. | ||
| Строка 68: | Строка 71: | ||
executeScalar(query: string, parameters?: QueryParameter[]): Promise<any> | executeScalar(query: string, parameters?: QueryParameter[]): Promise<any> | ||
client.requireFromDatabase() | |||
===client.requireFromDatabase()=== | |||
Выполняет запрос и срабатывает как require(), но код модуля получает из БД. В основном используется в планировщике. | Выполняет запрос и срабатывает как require(), но код модуля получает из БД. В основном используется в планировщике. | ||
requireFromDatabase(name: string): Promise<any> | requireFromDatabase(name: string): Promise<any> | ||
Версия от 05:27, 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>