Перейти к основному содержимому

Работа с базами данных

Системные базы данных. Пользовательские базы данных.

Требуется: Server_logo_3.png 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 в первой строке и будет указано местоположение файла базы данных.

DB_place.png

Автоочистка системной БД

Если место в постоянной памяти устройства, на котором запущено приложение 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, вы можете подключить к нему автоочистку системной БД.

Для активации необходимо:

  1. Перейти на веб-интерфейс приложения iRidium Server: http://192.168.1.254:8888/ (укажите адрес своего устройства).

  2. Перейти на вкладку System > Database .

  3. В разделе Database cleanup нажать кнопку Activate cleanup .

DatabaseCleanup1.png

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

DatabaseCleanup2.png

примечание

После активации функции автоочистки системной базы данных, запись данных в старый файл прекратится и начнется заново в другом формате (*.csv), поэтому старые данные будут не доступны для приложения iRidium Server, но файл старой базы данных останется в системе. Если вам больше не нужны эти данные, либо вы уже скопировали их в другое место, то можете их удалить (см. инструкцию ниже).

Перемещение и удаление старой БД

Если приложение iRidium Server запущено в системе Windows :

  1. Перейдите в папку с системной базой данных (по умолчанию - C:\Users\Documents\iRidium pro documents\Server\Database).

  2. Скопируйте файл 'IridiumStorage.db в другое место на диске, либо удалите этот файл, если старые данные больше не нужны.

Если приложение iRidium Server запущено в системе Linux :

  1. Установите и запустите WinSCP.

  2. Нажмите на вкладку New Site , настройте:

  • File Protocol : SCP
  • Host name :
  • Port number : 22
  • User name : логин
  • Password : пароль
  1. Нажмите Login .

DatabaseCleanup3.png

  1. Перейдите в папку с системной базой данных приложения iRidium server (обычно данная папка располагается по пути - /var/lib/iRidium Server/DataBase/, также может быть вариант - /root/iRidium Server/DataBase/)

  2. Скопируйте файл 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 в базу записывается каждое изменение тега (вне зависимости, на какое значение изменилось). При таком режиме размер базы данных будет увеличиваться очень быстро.

DatabaseCleanup4.png

Работа с базой через 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); //выводим в лог значения полей
};
});

Пользовательская база данных

Пользовательская база данных формируется интегратором. Имеется возможность полного форматирования базы.

Example_RU

Example_EN

Для создания вам понадобится выполнить следующие действия в редакторе скриптов:

  1. Создайте переменную, в которую вы запишете свойства базы данных.

var mybase= new SQL();

  • mybase - переменная,
  • new SQL() - создание объекта базы в Iridium JS.
  1. Создайте файл базы для дальнейшей работы.

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() - Закрытие базы.

  1. Создайте таблицу. Данная таблица будет пустой.

mybase.Execute('CREATE TABLE Info(ID int, Value double, Name string)');

CREATE TABLE - функция создания таблицы с именем Info. ID, Value, Name имена полей таблицы, которые будут содержать значения типа int, double, string соответственно. Вы можете менять имена полей, но вы должны обязательно указывать тип поля.

  1. Запись в таблицу.

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+');

Сначала ставится одинарная кавычка, затем плюс, потом сама переменная, далее снова плюс и опять одинарная кавычка.

  1. Удаление таблицы, добавление полей.

Метод для удаления таблицы:


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();
}