Skip to content
This repository was archived by the owner on Mar 2, 2025. It is now read-only.

this.db

do- edited this page Jun 30, 2023 · 59 revisions

Прежде всего, оговоримся: в отличие от прочих компонент API Dia.js, this.db — не фиксированное имя переменной (как, например, this.user), а лишь типовое обозначение ресурса определённой природы: связи с реляционной СУБД.

Приведём список методов API Dia.js, связанных с БД:

  • Высокий уровень (объекты)
    • Выборка данных
      • this.db.query — генератор SQL
      • this.db.fold — итерация / сбор данных
      • Извлечение самостоятельных объектов
        • this.db.get — получение отдельной записи
        • this.db.list — получение полного списка
      • Приписывание с существующим объектам
        • this.db.add — добавление полного списка как компоненты в заданный объект
        • this.db.add_all_cnt — добавление усечённого списка и счётчика записей как компонент в заданный объект
        • this.db.add_vocabularies — добавление словарей-справочников
    • Правка данных
      • Явная
      • Условная
        • this.db.upsert — добавление/обновление записи
        • this.db.delepsert — добавление/обновление/удаление пакета записей
        • this.db.insert_if_absent — добавление записи при условии отсутствия
    • Прочее
      • this.db.call — вызов хранимой процедуры
  • Низкий уровень (SQL как строка)
  • Прочее
    • this.db.break — прерывание исполняемого запроса
    • this.db.create_temp_as — создание временной таблицы по образцу существующей
    • this.db_dw.not_nuller — поток-трансформатор, подменяющий null на непустые значения для NOT NULL-столбцов
    • this.db_dw.set_session — задание сессии для соединения ClickHouse
    • this.db.to_limited_sql_params — ограничение выборки средствами свойственного db диалекта SQL

Table of Contents

Поддерживаемые СУБД

Теоретически API БД задуман как универсальный. Однако если бы все реляционные СУБД были на 100% совместимы, стоило бы использовать лишь одну из них — а подобного на практике не происходит и не предвидится. По факту у каждого продукта есть свои нишевые особенности, игнорировать которые нецелесообразно.

Ниже в этом разделе перечислены СУБД, поддерживаемые Dia.js.

Полноценное использование

PostgreSQL

Активная разработка Dia.js стартовала в 2019 году, в это время PostgreSQL действительно соответствовал своему слогану "самой продвинутой из числа СУБД с открытыми исходниками" — поэтому он рассматривается как продукт по умолчанию. Соответственно, практически всё, что написано в настоящей документации про БД, в первую очередь, относится к PostgreSQL.

В качестве драйвера используется node-postgres. Как и прочие внешние библиотеки, его необходимо добавлять в проект каждого приложения явно:

 cd my_project_directory/back
 npm i pg
 npm i pg-query-stream
 npm i pg-copy-streams

Последние две строки не обязательны, но рекомендуются:

  • pg-query-stream -- для исполнения this.db.select_loop и this.db.fold в поточном режиме, с гарантией от переполнения памяти;
  • pg-copy-streams -- на случай использования this.db.load.
После этого можно прописать в конфигурации
 "db": {
   "connectionString": "postgresql://user:p4$$W0rD@localhost:5432/db_name"
 },

и использовать this.db в коде модулей.

ClickHouse

Yandex ClickHouse — весьма специфическая СУБД, предназначенная в основном для хранения структурированных log-файлов. Там не только не поддерживаются транзакции, но вообще нет операторов UPDATE и DELETE. То есть ключевые слова UPDATE и DELETE имеются -- но не в общеизвестном ещё с SQL-86 смысле, а как опции ALTER TABLE.

SELECT вроде бы есть, но с ним надо обращаться очень осторожно. А индексы... не таковы, каковы они в большинстве общеупотребительных СУБД. Чего стоит одна неуникальность "первичных ключей".

С чем здесь просто — так это с подключением: вместо стороннего драйвера Dia.js напрямую обращается по http[s] к REST API ClickHouse. Всё, что нужно — указать строку конфигурации

 "db_dw": {
   "connectionString": "clickhouse://user:p4$$W0rD@https://host.dmz/db_name"
 },

Только для чтения

Перечисленные в этом разделе СУБД используются в проектах на Dia.js только в качестве сторонних источников данных, поэтому реализованная для них функциональность ограничена операциями чтения выборок и создания VIEW.

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

MySQL / MariaDB

MySQL -- СУБД весьма популярная... в прошлом. Но на момент разработки Dia.js у нас уже не было каких-либо резонов использовать её в новых проектах. Однако совместимость с унаследованными системами весьма важна, поэтому Dia.js включает поддержку MySQL / MariaDB, ограниченную ровно настолько, чтобы можно было извлекать данные из имеющейся БД, не создавая там собственных таблиц и не изменяя данных. Правда, при помощи модели можно определять SQL VIEWS: это весьма упрощает импорт данных.

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

 cd my_project_directory/back
 npm i mysql


И после этого можно определять ресурсы со строками вида

 "db_old": {
   "connectionString" : "mysql://user_name:p4$$W0rD@my_host:3306/db_name"
 }

MS SQL

В силу исторических причин по состоянию на момент написания этой строки с поддержкой MS SQL в Dia.js дело обстоит точно так же, как с MySQL: имеется ограниченный набор функций, пригодный для чтения данных из имеющейся чужой (наследуемой) БД.

Код, необходимый для подключения MS SQL практически совпадает с материалом предыдущего раздела с точностью до замены 'y' на 's':

 cd my_project_directory/back
 npm i mssql
 "db_old": {
   "connectionString" : "mssql://user_name:p4$$W0rD@my_host/db_name"
 }

Oracle

И ещё одна "тяжёлая" коммерческая СУБД, используемая пока лишь в качестве источника при миграции.

В данном случае установка драйвера не столь тривиальна, так что приведём ссылку на оригинальную документацию: https://oracle.github.io/node-oracledb/INSTALL.html#quickstart

(tl;dr: драйвер не "тонкий", так что требует установки Oracle Client. Для стандартных случаев вроде современных Linux и Windows на x64 бинарники для npm поставляются Oracle corp. и ставятся npm i oracledb, но для менее распространённых архитектур может потребоваться ручная сборка по месту).

Формат строки подключения подогнан под то, что описано выше, поэтому собственно connectionString, как её понимает oracledb, начинается после символа @:

  "db_of_theirs": {
    "connectionString": "oracle://user_name:p4$$W0rD@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SID=ORCL)))"
  },

Специфические

Этот раздел содержит описание того, что выглядит как подключение к реляционной СУБД, однако в действительности является чем-то иным. Пока такой интерфейс один: это ODS/DW, описанный в статье Архивация таблиц.

Clone this wiki locally