Работа с базами данных
Системные базы данных. Пользовательские базы данных.
Требуется:
iRidium server
документация обновлена 01.01.2024
База данных(БД) представляет собой логический объект, в котором размещаются таблицы и индексы.
В iRidium существуют следующие типы баз:
- Системные;
- Пользовательские.
Перед началом работы с базой данных, необходимо настроить теги для записи в базу данных.
Выполнить настройку можно только в серверном проекте.
Системная база данных
Системная база данных создаётся вместе с серверным проектом и хранит данные поступающие с тегов.
Поддерживает только запрос, чтение.
Системная база содержит несколько таблиц:
- FLOAT_TAG_HISTORY (содержит поля ID, TAG_ID, DATETIME, QUALITY, VALUE)
- INTEGER_TAG_HISTORY (содержит поля ID, TAG_ID, DATETIME, QUALITY, VALUE)
- QUALITY_LIST (содержит поля ID, NAME)
- STRING_TAG_HISTORY (содержит поля ID, TAG_ID, DATETIME, QUALITY, VALUE)
- TAGS_PASSPORT (содержит поля TAG_ID, TAG_TYPE, NAME, STATUS)
- TAG_STATUSES (содержит поля ID, NAME)
- TAG_TYPES_LIST (содержит поля ID, NAME, TABLE_NAME)
Местонахождение
Файл базы можно найти через Web - сервер. Для этого необходимо открыть страницу Web - сервера в браузере. Войти в свой аккаунт. Появится главное окно страницы, содержащее вкладки для работы с сервером. Во вкладке Database в первой строке и будет указано местоположение файла базы данных.

Автоочистка системной БД
Если место в постоянной памяти устройства, на котором запущено приложение iRidium Server, заканчивается, то можно воспользоваться системой автоматической очистки системной базы данных.
Автоочистка системной БД доступна на сервере начиная с v.1.3.55. Функция автоочистки имеет следующие уровни заполнения базы данных:
- Normal - нормальный уровень [0-80%],
- Warning - выдаётся предупреждение [80-90%],
- Cleaning - запускается очистка БД [90-95%],
- Overflow - БД переполнилась - запись во все таблицы БД останавливается [95-100%].
При этом установлен предельный уровень заполнения базы данных в 300Мб.
Информация о достижении каждого уровня, а также о начале и завершении очистки базы данных выводится в лог сервера.
Стратегия очистки системной базы данных:
- Cleaning - записи о значениях каналов обратной связи удаляются:
- целыми файлами,
- от старых к новым,
- равномерно по всем каналам обратной связи (принцип справедливости - если какой-то канал занимает места больше других, то для него, соответственно, удалится больше файлов),
- до уровня заполнения Normal (на границе c Warning).
- Overflow :
- БД переходит в режим работы Readonly,
- выполняется всё то же, что и для Cleaning,
- если удалось успешно очистить память хотя бы ниже уровня Overflow - БД выходит из режима Readonly.
- Если сервер запущен впервые и в его документах нет старой базы данных IridiumStorage.db , то автоочистка будет включена по умолчанию и база данных будет сразу же сохраняться в формате *.csv , иначе необходимо активировать автоочистку БД вручную (см. инструкцию .
- Если вы по какой либо причине хотите отключить автоочистку БД, напишите в нашу тех. поддержку: support@iridi.com.
Активация функции автоочистки системной БД
После обновления используемого сервера до версии 1.3.55, вы можете подключить к нему автоочистку системной БД.
Для активации необходимо:
-
Перейти на веб-интерфейс приложения iRidium Server: http://192.168.1.254:8888/ (укажите адрес своего устройства).
-
Перейти на вкладку System > Database .
-
В разделе Database cleanup нажать кнопку Activate cleanup .

- В появившемся окне с предупреждением, необходимо нажать кнопку Activate cleanup для активации функции автоочистки базы данных, либо нажать Cancel для отмены.

После активации функции автоочистки системной базы данных, запись данных в старый файл прекратится и начнется заново в другом формате (*.csv), поэтому старые данные будут не доступны для приложения iRidium Server, но файл старой базы данных останется в системе. Если вам больше не нужны эти данные, либо вы уже скопировали их в другое место, то можете их удалить (см. инструкцию ниже).
Перемещение и удаление старой БД
Если приложение iRidium Server запущено в системе Windows :
-
Перейдите в папку с системной базой данных (по умолчанию - C:\Users\Documents\iRidium pro documents\Server\Database).
-
Скопируйте файл 'IridiumStorage.db в другое место на диске, либо удалите этот файл, если старые данные больше не нужны.
Если приложение iRidium Server запущено в системе Linux :
-
Установите и запустите WinSCP.
-
Нажмите на вкладку New Site , настройте:
- File Protocol : SCP
- Host name :
- Port number : 22
- User name : логин
- Password : пароль
- Нажмите Login .

-
Перейдите в папку с системной базой данных приложения iRidium server (обычно данная папка располагается по пути - /var/lib/iRidium Server/DataBase/, также может быть вариант - /root/iRidium Server/DataBase/)
-
Скопируйте файл IridiumStorage.db в нужную папку на вашем компьютере, либо удалите этот файл из папки с системной базой данных приложения iRidium Server, если старые данные больше не нужны.
Настройка для передачи данных в БД
Создайте feedback для устройства и настройках выберите параметр Store In DB .
Store In DB - определяет тип данных для записи поступающих значений: *None - Значения тега в базу записываться не будут; *Signed 32bit - Значения тега будут записываться в виде целых чисел; *Float 64bit - Значения тега будут записываться в виде десятичной дроби; *String UTF8 - Значения тега будут записываться в виде строки с кодировкой UTF8. Выбрав тип данных, вы можете определить стратегию записи: *Deadband - Если значение тега будет меньше, чем установленное число в поле “Deadband”, то это значение в базу записано не будет. Такая стратегия работает только для чисел; *Interval - Запись значения будет проводиться с временным интервалом. Интервал можно выбрать из предложенного списка или установить свой. Для этого в поле “Interval” необходимо выбрать значение “Custom” и ввести своё время и единицу измерения.
При Deadband = 0 в базу записывается каждое изменение тега (вне зависимости, на какое значение изменилось). При таком режиме размер базы данных будет увеличиваться очень быстро.

Работа с базой через JavaSсript
Данные методы работают только со старым файлом БД типа *.db (созданные сервером до версии XXX), с новым типом *.csv они работать не будут.
Создайте скрипт с запросами, который будет выводить в лог данные по определённые условиям. Для работы с запросами необходимо изучить язык SQL. Ниже будут рассмотрены часто используемые сценарии работы с базой.
var sql = IR.GetDatabase(); // присвоение переменной sql свойства системной базы.
Запрос из БД:
Присвоить переменной examp свойства Request базы sql. В скобках и одинарных кавычках пишется тело запроса.
var examp = sql.Request('SELECT ...');
Вывод данных в лог из базы:
IR.Log(examp.Columns); // выводит в лог количество полей (столбцов) в запросе
IR.Log(examp.Rows); // выводит в лог количество записей (строк) в запросе
IR.Log(examp.GetRowValue(0,0)); //выводит в лог значение ячейки в строке с индексами (строка, столбец);
IR.Log(examp.GetColumnName(0)); //выводит имя поля, у которого индекс соответствует числу в скобках.
Пример: необходимо выбрать из базы информацию о тегах, которые содержат значение <1500.
var i;
var j;
IR.AddListener(IR.EVENT_START,0,function()
{
var sql = IR.GetDatabase(); // присвоили переменной sql свойства системной базы.
var examp = sql.Request('SELECT DISTINCT(ID), VALUE, TAG_ID FROM FLOAT_TAG_HISTORY WHERE VALUE<1500'); // присвоение переменной examp свойства Request базы sql. В скобках и одинарных кавычках пишется тело запроса.
for (i=0;i<examp.Columns;i++) //организовали цикл для вывода значений
for (j=0;j<examp.Rows;j++)
{
IR.Log(examp.GetRowValue(i,j); //выводим в лог значения полей
};
});
Пользовательская база данных
Пользовательская база данных формируется интегратором. Имеется возможность полного форматирования базы.
Для создания вам понадобится выполнить следующие действия в редакторе скриптов:
- Создайте переменную, в которую вы запишете свойства базы данных.
var mybase= new SQL();
- mybase - переменная,
- new SQL() - создание объекта базы в Iridium JS.
- Создайте файл базы для дальнейшей работы.
mybase.Open('Example.db');
Open - открытие файла базы. Если такого файла нет, то он будет создан в папке документов программы, например C:\Users\UserName\Documents\iRidium mobile 3\Settings\ Server\Database'Example.db' - имя базы с расширением.
Для быстрой и корректной записи в БД, необходимо использовать логические команды.
mybase.Execute("BEGIN");
...
// Операции с базой;
...
mybase.Execute("COMMIT");
mybase.Close();
Execute - функция выполнения действия с базой, "BEGIN" - начало записи в базу. "COMMIT" - конец записи в базу. Close() - Закрытие базы.
- Создайте таблицу. Данная таблица будет пустой.
mybase.Execute('CREATE TABLE Info(ID int, Value double, Name string)');
CREATE TABLE - функция создания таблицы с именем Info. ID, Value, Name имена полей таблицы, которые будут содержать значения типа int, double, string соответственно. Вы можете менять имена полей, но вы должны обязательно указывать тип поля.
- Запись в таблицу.
mybase.Execute('INSERT INTO Info(ID, Value, Name) VALUES(1,2.5,"sunny day")');
INSERT INTO осуществляет запись в таблицу Info, а именно в поля ID, Value, Name. VALUES - параметры, которые будут записаны в поля. Соответственно в поле ID будет записано число 1, в поле Value будет записано число 2.5, в поле Name текст "sunny day".
Параметров в скобках после VALUES должно быть столько же, сколько и объявленных полей в скобках после INSERT INTO ().
Существуют некоторые особенности записи значений в поля таблицы. Например, если вы хотите записать текст, то синтаксис будет таким:
VALUES("Iridium", "Mobile"); (Текст пишется в двойных кавычках).
Если вы хотите записать число, то оформлять следует так:
VALUES( 1, 2.5, 36.788); (Число пишется без кавычек, десятичное число пишется с точкой)
Если необходимо записать значение переменной, то для неё используют:
// var CV = "Hello!"; (Объявленные ранее переменные)
// var V = 1.25;
...
VALUES("'+CV+'",'+V+');
Сначала ставится одинарная кавычка, затем плюс, потом сама переменная, далее снова плюс и опять одинарная кавычка.
- Удаление таблицы, добавление полей.
Метод для удаления таблицы:
mybase.Execute('DROP TABLE Testing');
Добавление поля в существующую таблицу.
mybase.Execute('ALTER TABLE Testing DROP COLUMN New_column');
Автоочистка пользовательской БД
Скоро в релизе.
При включении автоочистки баз данных на веб-интерфейсе сервера, данные из пользовательской базы данных не удаляются, но для нее автоматически срабатывает вакуумирование данных (VACUUM). Что позволяет в целом уменьшить размер базы данных.
-
Вакуумирование данных работает только для сервера v.XXX и выше.
-
Процесс вакуумирования может приводить к зависанию системы, в том числе на продолжительное время, если база слишком большая. Также может привести к перезапуску системы на Linux, если приложение iRidium Server было запущено с watchdog.
-
Если необходимо дополнительно удалить часть устаревших данных из пользовательской базы данных, чтобы еще уменьшить ее размер, то можно воспользоваться скриптовыми слушателями для отслеживания уровня заполнения базы данных.
Пример скрипта:
//Listener for NORMAL level
IR.AddListener(IR.EVENT_USER_DB_FILL_LEVEL_NORMAL, 0, function(name){
IR.Log(name + ": NORMAL FILL LEVEL EVENT");
});
//Listener for WARNING level
IR.AddListener(IR.EVENT_USER_DB_FILL_LEVEL_WARNING, 0, function(name){
IR.Log(name + ": WARNING FILL LEVEL EVENT");
});
//Listener for CLEANING level
IR.AddListener(IR.EVENT_USER_DB_FILL_LEVEL_CLEANING, 0, function(name){
IR.Log(name + ": CLEANING FILL LEVEL EVENT");
});
//Listener for OVERFLOW level
IR.AddListener(IR.EVENT_USER_DB_FILL_LEVEL_OVERFLOW, 0, function(name){
IR.Log(name + ": OVERFLOW FILL LEVEL EVENT");
if(EndsWith(name, "MyBase.db"))
{
IR.Log("My own cleaning...");
mybase.Open('MyBase.db', true);
mybase.Execute('DELETE FROM Info WHERE ID < 1000');
mybase.Close();
IR.Log("End my own cleaning.");
}
});
//Function for determining the name of the desired user database
function EndsWith(str, stringPart){
if(str !== undefined && stringPart !== undefined) {
var wordIndex = str.lastIndexOf(stringPart);
var result = str.substring(wordIndex, str.length);
if(result === stringPart){
return true;
} else {
return false;
}
}
}
Создание запросов
Данные методы работают только со старым файлом БД типа *.db (созданные сервером до версии XXX), с новым типом *.csv они работать не будут.
Далее рассмотрим часто используемые сценарии работы с базой. В редакторе скриптов Iridium можно написать запросы, которые будут выводить в лог данные по определённым условиям. Для работы с запросами необходимо изучить язык SQL.
var mybase= new SQL(); // присвоили переменной sql свойства системной базы.
Для того, чтобы создать запрос по базе, необходимо выполнить следующее действие:
var this_request = mybase.Request('SELECT ...'); // присвоение переменной this_request свойства Request базы mybase. В скобках и одинарных кавычках пишется тело запроса.
Вывод в лог.
// выводит в лог количество полей (столбцов) в запросе
IR.Log(this_request.Columns);
// выводит в лог количество записей (строк) в запросе
IR.Log(this_request.Rows);
//выводит в лог значение ячейки в строке с индексами (строка, столбец);
IR.Log(this_request.GetRowValue(0,0));
//выводит имя поля, у которого индекс соответствует числу в скобках.
IR.Log(this_request.GetColumnName(0));
Пример: необходимо выбрать из базы информацию о тегах, которые содержат значение <10.
function request()
{
//Открытие базы. Если такой базы нет, то она будет создана автоматически
mybase.Open('Example.db');
//Начало работы с базой
mybase.Execute("BEGIN");
// Создание переменной и присвоение ей метода запроса Request
var this_request = mybase.Request('SELECT * FROM Info WHERE Value<10');
//выводит имя поля, у которого индекс соответствует числу в скобках.
IR.Log(this_request.GetColumnName(0)+ '\t'+ this_request.GetColumnName(1)+ '\t'+ this_request.GetColumnName(2));
for (i=0;i<this_request.Rows;i++)
//вывод в лог значений полей
IR.Log(this_request.GetRowValue(0,i)+ '\t'+ this_request.GetRowValue(1,i)+ '\t'+ this_request.GetRowValue(2,i));
//Конец работы с базой
mybase.Execute("COMMIT");
//Закрытие базы
mybase.Close();
}