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

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

Материал из wiki.chemsoft.ru
 
(не показано 8 промежуточных версий этого же участника)
Строка 21: Строка 21:
Можно в полностью автоматическом режиме получить клиент для нужной СУБД, получая при этом универсальное решение для любой БД:
Можно в полностью автоматическом режиме получить клиент для нужной СУБД, получая при этом универсальное решение для любой БД:


 
<syntaxhighlight lang="javascript">
const { getChemicClient } = require('@chemsoft/db')
const { getChemicClient } = require('@chemsoft/db')


const client = getChemicClient()  
const client = getChemicClient()  
</syntaxhighlight>
Такой трюк работает, благодаря общему интерфейсу.
Такой трюк работает, благодаря общему интерфейсу.


client.connect()
===<code>client.connect()</code>===
Производит подключение к БД. Почему не реализовано в конструкторе? Для того, чтобы реализовать ленивый запрос зависимостей, таким образом, подключены будут только используемые в текущий момент пакеты для подключения к БД.
Производит подключение к БД. Почему не реализовано в конструкторе? Для того, чтобы реализовать ленивый запрос зависимостей, таким образом, подключены будут только используемые в текущий момент пакеты для подключения к БД.


<syntaxhighlight lang="javascript">
async connect(): Promise<void>
</syntaxhighlight>


async connect(): Promise<void>
===<code>client.disconnect()</code>===
client.disconnect()
Производит отключение от БД в явном виде, таким образом не будет создаваться лишних соединений с БД, на одного пользователя будет только одно подключение. Необходимо вызвать в конце потока исполнения скрипта.
Производит отключение от БД в явном виде, таким образом не будет создаваться лишних соединений с БД, на одного пользователя будет только одно подключение. Необходимо вызвать в конце потока исполнения скрипта.


<syntaxhighlight lang="javascript">
async disconnect(): Promise<void>
</syntaxhighlight>


async disconnect(): Promise<void>
===<code>client.execute()</code>===
client.execute()
Выполняет запрос. В зависимости от типа БД ответ может различаться.
Выполняет запрос. В зависимости от типа БД ответ может различаться.


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


<syntaxhighlight lang="javascript">
interface IExecuteResult {
interface IExecuteResult {
   records: Array<{ [columnName: string]: any }>;
   records: Array<{ [columnName: string]: any }>;
Строка 49: Строка 55:
   }
   }
}
}
</syntaxhighlight>
Тип получаемых параметров:
Тип получаемых параметров:


<syntaxhighlight lang="javascript">
type QueryParameter = null |
type QueryParameter = null |
                       number |
                       number |
Строка 57: Строка 66:
                       Date |
                       Date |
                       { type: 'date' | 'time'; value: Date }
                       { type: 'date' | 'time'; value: Date }
query: string текст SQL запроса parameters?: QueryParameter[] массив параметров запроса, в тексте запроса можно ставить символ ?, на его место будет подставляться правильно отформатированный параметр
</syntaxhighlight>


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


<syntaxhighlight lang="javascript">
execute(query: string, parameters?: QueryParameter[]): Promise<IExecuteResult>
execute(query: string, parameters?: QueryParameter[]): Promise<IExecuteResult>
client.executeScalar()
</syntaxhighlight>
 
===<code>client.executeScalar()</code>===
Выполняет запрос и возвращает одно скалярное значение (даже если может быть возвращено несколько колонок). Если возвращено несколько записей и колонок, то возвращает данные из первой записи и первой колонки.
Выполняет запрос и возвращает одно скалярное значение (даже если может быть возвращено несколько колонок). Если возвращено несколько записей и колонок, то возвращает данные из первой записи и первой колонки.


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


<syntaxhighlight lang="javascript">
executeScalar(query: string, parameters?: QueryParameter[]): Promise<any>
executeScalar(query: string, parameters?: QueryParameter[]): Promise<any>
client.requireFromDatabase()
</syntaxhighlight>
Выполняет запрос и срабатывает как require(), но код модуля получает из БД. В основном используется в планировщике.


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


<syntaxhighlight lang="javascript">
requireFromDatabase(name: string): Promise<any>
requireFromDatabase(name: string): Promise<any>
</syntaxhighlight>

Текущая версия от 05:35, 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>