-
Notifications
You must be signed in to change notification settings - Fork 17
this.db
Прежде всего, оговоримся: в отличие от прочих компонент 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.insert — добавление записи
- this.db.load — массовое добавление записей
- this.db.update — обновление записи
- this.db.delete — удаление записей
- Условная
- this.db.upsert — добавление/обновление записи
- this.db.delepsert — добавление/обновление/удаление пакета записей
- this.db.insert_if_absent — добавление записи при условии отсутствия
- Явная
- Прочее
- this.db.call — вызов хранимой процедуры
- Выборка данных
- Низкий уровень (SQL как строка)
- Извлечение данных
- this.db.select_all — получение списка записей
- this.db.select_all_cnt — получение части списка и общего числа записей
- this.db.select_col — получение списка скаляров
- this.db.select_scalar — получение отдельного поля
- this.db.select_hash — получение единственной записи
- this.db.select_loop — проход по выборке
- this.db.select_stream — получение потока объектов
- Модификация данных
- this.db.do — исполнение произвольного SQL
- this.db_fed.warehouse — копирование в архив
- Извлечение данных
- Прочее
- 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
Теоретически API БД задуман как универсальный. Однако если бы все реляционные СУБД были на 100% совместимы, стоило бы использовать лишь одну из них — а подобного на практике не происходит и не предвидится. По факту у каждого продукта есть свои нишевые особенности, игнорировать которые нецелесообразно.
Ниже в этом разделе перечислены СУБД, поддерживаемые Dia.js.
Активная разработка 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 в коде модулей.
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 -- СУБД весьма популярная... в прошлом. Но на момент разработки 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 в 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"
}
И ещё одна "тяжёлая" коммерческая СУБД, используемая пока лишь в качестве источника при миграции.
В данном случае установка драйвера не столь тривиальна, так что приведём ссылку на оригинальную документацию: 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, описанный в статье Архивация таблиц.