You've already forked OpenIntegrations
mirror of
https://github.com/Bayselonarrend/OpenIntegrations.git
synced 2025-08-10 22:41:43 +02:00
SQLite: получение записей в ORM
This commit is contained in:
@@ -149,7 +149,7 @@
|
||||
// Таблица - Строка - Имя таблицы - table
|
||||
// СтруктураКолонок - Структура Из КлючИЗначение - Структура колонок: Ключ > имя, Значение > Тип данных - cols
|
||||
// НеВыполнять - Булево - Истина > Не выполняет запрос, а возвращает текст SQL - noex
|
||||
// Соединение - Строка - Существующее соединение или путь к базе - db
|
||||
// Соединение - Строка, Произвольный - Существующее соединение или путь к базе - db
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Структура Из КлючИЗначение, Строка - Результат выполнения запроса или его текст
|
||||
@@ -184,13 +184,13 @@
|
||||
// Добавляет записи в таблицу
|
||||
//
|
||||
// Параметры:
|
||||
// Таблица - Строка - Имя таблицы - table
|
||||
// МассивДанных - Массив Из Структура - Массив структур данных строк: Ключ > поле, Значение > значение поля - rows
|
||||
// Транзакция - Булево - Истина > добавление записей в транзакции с откатом при ошибке - trn
|
||||
// Соединение - Строка - Существующее соединение или путь к базе - db
|
||||
// Таблица - Строка - Имя таблицы - table
|
||||
// МассивДанных - Массив Из Структура - Массив структур данных строк: Ключ > поле, Значение > значение поля - rows
|
||||
// Транзакция - Булево - Истина > добавление записей в транзакции с откатом при ошибке - trn
|
||||
// Соединение - Строка, Произвольный - Существующее соединение или путь к базе - db
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Структура Из КлючИЗначение, Строка - Результат выполнения запроса или его текст
|
||||
// Структура Из КлючИЗначение, Строка - Результат выполнения запроса
|
||||
Функция ДобавитьЗаписи(Знач Таблица, Знач МассивДанных, Знач Транзакция = Истина, Знач Соединение = "") Экспорт
|
||||
|
||||
OPI_ПреобразованиеТипов.ПолучитьМассив(МассивДанных);
|
||||
@@ -259,14 +259,84 @@
|
||||
СтруктураРезультата.Вставить("commit", Завершение);
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
СтруктураРезультата = Новый Структура("result,rows,errors"
|
||||
, МассивОшибок.Количество = 0
|
||||
|
||||
СтруктураРезультата = Новый Структура("result,rows,errors"
|
||||
, МассивОшибок.Количество() = 0
|
||||
, СчетчикУспешных
|
||||
, МассивОшибок);
|
||||
|
||||
Возврат СтруктураРезультата;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Получить записи
|
||||
// Получает записи из выбранной таблицы
|
||||
//
|
||||
// Параметры:
|
||||
// Таблица - Строка - Имя таблицы - table
|
||||
// Поля - Массив Из Строка - Поля для выборки - fields
|
||||
// Фильтры - Массив Из Структура - Массив фильтров. См. ПолучитьСтруктуруФильтраЗаписей - filter
|
||||
// Сортировка - Структура Из КлючИЗначение - Сортировка: Ключ > поле, Значение > направление (ASC, DESC) - order
|
||||
// Количество - Число - Ограничение количества получаемых строк - limit
|
||||
// Соединение - Строка, Произвольный - Существующее соединение или путь к базе - db
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Структура Из КлючИЗначение, Строка - Результат выполнения запроса
|
||||
Функция ПолучитьЗаписи(Знач Таблица
|
||||
, Знач Поля = "*"
|
||||
, Знач Фильтры = ""
|
||||
, Знач Сортировка = ""
|
||||
, Знач Количество = ""
|
||||
, Знач Соединение = "") Экспорт
|
||||
|
||||
Схема = OPI_ЗапросыSQL.ПустаяСхемаSQL("SELECT");
|
||||
|
||||
OPI_ЗапросыSQL.УстановитьИмяТаблицы(Схема, Таблица);
|
||||
OPI_ЗапросыSQL.УстановитьЛимит(Схема, Количество);
|
||||
|
||||
ЗаполнитьПоля(Схема, Поля);
|
||||
ЗаполнитьФильтры(Схема, Фильтры);
|
||||
ЗаполнитьСортировку(Схема, Сортировка);
|
||||
|
||||
Запрос = OPI_ЗапросыSQL.СформироватьТекстSQL(Схема);
|
||||
|
||||
Результат = ВыполнитьЗапросSQL(Запрос, Схема["values"], , Соединение);
|
||||
|
||||
Возврат Результат;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Получить структуру фильтра записей
|
||||
// Получает структуру шаблон для фильтрации записей в запросах ORM
|
||||
//
|
||||
// Примечание:
|
||||
// Использование признака `raw` необходимо для составных конструкций, вроде `BEETWEEN`.^^
|
||||
// Например: при `raw:false` фильтр `type:BETWEEN` `value:10 AND 20` будет интерпритирован как `BETWEEN ?1 `^^
|
||||
// где `?1 = "10 AND 20"`, что приведет к ошибке.^^
|
||||
// В таком случае необходимо использовать `raw:true` для установки условия напрямую в текст запроса
|
||||
//
|
||||
// Параметры:
|
||||
// Пустая - Булево - Истина > структура с пустыми значениями, Ложь > в значениях будут описания полей - empty
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Структура Из КлючИЗначение - Элемент фильтра записей
|
||||
Функция ПолучитьСтруктуруФильтраЗаписей(Знач Пустая = Ложь) Экспорт
|
||||
|
||||
СтруктураФильтра = Новый Структура;
|
||||
|
||||
СтруктураФильтра.Вставить("field", "<имя поля для отбора>");
|
||||
СтруктураФильтра.Вставить("type" , "<тип сравнения>");
|
||||
СтруктураФильтра.Вставить("value", "<значение для сравнения>");
|
||||
СтруктураФильтра.Вставить("union", "<связь со следующим условием: AND, OR и пр.>");
|
||||
СтруктураФильтра.Вставить("raw" , "<истина - значение будет вставлено текстом, как есть, ложь - через параметр>");
|
||||
|
||||
Если Пустая Тогда
|
||||
СтруктураФильтра = OPI_Инструменты.ОчиститьКоллекциюРекурсивно(СтруктураФильтра);
|
||||
КонецЕсли;
|
||||
|
||||
//@skip-check constructor-function-return-section
|
||||
Возврат СтруктураФильтра;
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
@@ -374,7 +444,58 @@
|
||||
|
||||
МассивПолей.Добавить(Элемент.Ключ);
|
||||
МассивЗначений.Добавить(Элемент.Значение);
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура ЗаполнитьПоля(Схема, Знач Поля)
|
||||
|
||||
Если Не ЗначениеЗаполнено(Поля) Тогда
|
||||
Поля = "*";
|
||||
КонецЕсли;
|
||||
|
||||
OPI_ПреобразованиеТипов.ПолучитьМассив(Поля);
|
||||
|
||||
Для Каждого Поле Из Поля Цикл
|
||||
OPI_ЗапросыSQL.ДобавитьПоле(Схема, Поле);
|
||||
КонецЦикла;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура ЗаполнитьФильтры(Схема, Знач Фильтры)
|
||||
|
||||
Если Не ЗначениеЗаполнено(Фильтры) Тогда
|
||||
Возврат;
|
||||
КонецЕсли;
|
||||
|
||||
OPI_ПреобразованиеТипов.ПолучитьМассив(Фильтры);
|
||||
|
||||
Для Каждого Фильтр Из Фильтры Цикл
|
||||
|
||||
OPI_ЗапросыSQL.ДобавитьОтбор(Схема
|
||||
, Фильтр["field"]
|
||||
, Фильтр["type"]
|
||||
, Фильтр["value"]
|
||||
, Фильтр["union"]
|
||||
, Фильтр["raw"]);
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура ЗаполнитьСортировку(Знач Схема, Знач Сортировка)
|
||||
|
||||
Если Не ЗначениеЗаполнено(Сортировка) Тогда
|
||||
Возврат;
|
||||
КонецЕсли;
|
||||
|
||||
OPI_ПреобразованиеТипов.ПолучитьМассив(Сортировка);
|
||||
|
||||
Для Каждого Элемент Из Сортировка Цикл
|
||||
|
||||
OPI_ЗапросыSQL.ДобавитьСортировку(Схема, Элемент.Ключ, Элемент.Значение);
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
КонецПроцедуры
|
||||
|
@@ -145,6 +145,45 @@
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура ДобавитьОтбор(Схема, Знач Поле, Знач Тип, Знач Значение, Знач Группировка, Знач КакЕсть) Экспорт
|
||||
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(Поле);
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(Тип);
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(Группировка);
|
||||
OPI_ПреобразованиеТипов.ПолучитьБулево(КакЕсть);
|
||||
|
||||
ОсновнаяСтруктура = Новый Структура("field,type,union"
|
||||
, Поле
|
||||
, Тип
|
||||
, Группировка);
|
||||
|
||||
Если КакЕсть Тогда
|
||||
|
||||
ОсновнаяСтруктура.Вставить("value", Строка(Значение));
|
||||
|
||||
Иначе
|
||||
|
||||
Схема["values"].Добавить(Значение);
|
||||
|
||||
ПорядковыйНомер = Схема["values"].Количество();
|
||||
ОсновнаяСтруктура.Вставить("value", "?" + OPI_Инструменты.ЧислоВСтроку(ПорядковыйНомер));
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
|
||||
Схема["filter"].Добавить(ОсновнаяСтруктура);
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура ДобавитьСортировку(Схема, Знач Поле, Знач Тип) Экспорт
|
||||
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(Поле);
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(Тип);
|
||||
|
||||
Схема["sort"].Добавить(Новый Структура("field,type", Поле, Тип));
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура УстановитьИмяТаблицы(Схема, Знач Имя) Экспорт
|
||||
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(Имя);
|
||||
@@ -153,6 +192,14 @@
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура УстановитьЛимит(Схема, Знач Количество) Экспорт
|
||||
|
||||
OPI_ПреобразованиеТипов.ПолучитьЧисло(Количество);
|
||||
|
||||
Схема.Вставить("limit", Количество);
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Область СлужебныеПроцедурыИФункции
|
||||
@@ -165,9 +212,10 @@
|
||||
|
||||
Схема.Вставить("table" , "");
|
||||
Схема.Вставить("filter" , Новый Массив);
|
||||
Схема.Вставить("order_by", Новый Массив);
|
||||
Схема.Вставить("limit" , Новый Массив);
|
||||
Схема.Вставить("fileds" , Новый Массив);
|
||||
Схема.Вставить("order" , Новый Массив);
|
||||
Схема.Вставить("limit" , 0);
|
||||
Схема.Вставить("set" , Новый Массив);
|
||||
Схема.Вставить("values" , Новый Массив);
|
||||
|
||||
Возврат Схема;
|
||||
|
||||
@@ -224,8 +272,21 @@
|
||||
|
||||
Функция СформироватьТекстSelect(Знач Схема)
|
||||
|
||||
ТекстSQL = "";
|
||||
ПроверитьОбязательныеПоляСхемы(Схема, "table,filter,order,limit,set");
|
||||
|
||||
Таблица = Схема["table"];
|
||||
Поля = Схема["set"];
|
||||
Фильтры = Схема["filter"];
|
||||
Сортировка = Схема["order"];
|
||||
Количество = Схема["limit"];
|
||||
|
||||
ШаблонSQL = "SELECT %1 FROM %2
|
||||
|%3";
|
||||
|
||||
БлокНастроек = СформироватьТекстНастроекSelect(Фильтры, Сортировка, Количество);
|
||||
|
||||
ТекстSQL = СтрШаблон(ШаблонSQL, Таблица, Поля, БлокНастроек);
|
||||
|
||||
Возврат ТекстSQL;
|
||||
|
||||
КонецФункции
|
||||
@@ -301,6 +362,95 @@
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
Функция СформироватьТекстНастроекSelect(Знач Фильтры, Знач Сортировка, Знач Количество)
|
||||
|
||||
ШаблонБлока = "%1
|
||||
|%2
|
||||
|%3";
|
||||
|
||||
ТекстФильтра = СформироватьТекстФильтра(Фильтры);
|
||||
ТекстСортировки = СформироватьТекстСортировки(Сортировка);
|
||||
ТекстКоличества = СформироватьТекстКоличества(Количество);
|
||||
|
||||
ТекстБлока = СтрШаблон(ШаблонБлока, ТекстФильтра, ТекстСортировки, ТекстКоличества);
|
||||
|
||||
Возврат ТекстБлока;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция СформироватьТекстФильтра(Знач Фильтры)
|
||||
|
||||
Если Не ЗначениеЗаполнено(Фильтры) Тогда
|
||||
Возврат "";
|
||||
КонецЕсли;
|
||||
|
||||
ТекстФильтров = "WHERE %1";
|
||||
|
||||
МассивФильтров = Новый Массив;
|
||||
|
||||
Счетчик = 1;
|
||||
Всего = Фильтры.Количество();
|
||||
|
||||
Для Каждого Фильтр Из Фильтры Цикл
|
||||
|
||||
ТекущийТекст = "%1 %2 %3 %4";
|
||||
|
||||
Поле = Фильтр["field"];
|
||||
Тип = Фильтр["type"];
|
||||
Значение = Фильтр["value"];
|
||||
Соединение = Фильтр["union"];
|
||||
Соединение = ?(ЗначениеЗаполнено(Соединение), Соединение, "AND");
|
||||
|
||||
Если Счетчик = Всего Тогда
|
||||
Соединение = "";
|
||||
КонецЕсли;
|
||||
|
||||
ТекущийТекст = СтрШаблон(ТекущийТекст, Поле, Тип, Значение, Соединение);
|
||||
МассивФильтров.Добавить(ТекущийТекст);
|
||||
|
||||
Счетчик = Счетчик + 1;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
ТекстФильтров = СтрШаблон(ТекстФильтров, СтрСоединить(МассивФильтров, " "));
|
||||
|
||||
Возврат ТекстФильтров;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция СформироватьТекстСортировки(Знач Сортировка)
|
||||
|
||||
Если Не ЗначениеЗаполнено(Сортировка) Тогда
|
||||
Возврат "";
|
||||
КонецЕсли;
|
||||
|
||||
ТекстСортировки = "ORDER BY %1";
|
||||
|
||||
МассивСортировки = Новый Массив;
|
||||
|
||||
Для Каждого Элемент Из Сортировка Цикл
|
||||
МассивСортировки.Добавить(Элемент.Ключ + " " + Элемент.Значение);
|
||||
КонецЦикла;
|
||||
|
||||
ТекстСортировки = СтрШаблон(ТекстСортировки, СтрСоединить(МассивСортировки, ", "));
|
||||
|
||||
Возврат ТекстСортировки;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция СформироватьТекстКоличества(Знач Количество)
|
||||
|
||||
Если Не ЗначениеЗаполнено(Количество) Тогда
|
||||
Возврат "";
|
||||
КонецЕсли;
|
||||
|
||||
ТекстКоличества = "LIMIT %1";
|
||||
ТекстКоличества = СтрШаблон(ТекстКоличества, OPI_Инструменты.ЧислоВСтроку(Количество));
|
||||
|
||||
Возврат ТекстКоличества;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Процедура ПроверитьОбязательныеПоляСхемы(Схема, Знач Поля)
|
||||
|
||||
МассивОбязательныхПолей = СтрРазделить(Поля, ",");
|
||||
|
@@ -2230,12 +2230,13 @@
|
||||
ПараметрыТеста = Новый Структура;
|
||||
|
||||
База = ПолучитьИмяВременногоФайла("sqlite");
|
||||
OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("CDEK_OrderUUID", База);
|
||||
OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("SQLite_DB", База);
|
||||
OPI_Инструменты.ДобавитьПоле("SQLite_DB", База, "Строка", ПараметрыТеста);
|
||||
|
||||
OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture", ПараметрыТеста);
|
||||
|
||||
SQLite_СоздатьТаблицу(ПараметрыТеста);
|
||||
SQLite_ДобавитьЗаписи(ПараметрыТеста);
|
||||
|
||||
Попытка
|
||||
УдалитьФайлы(База);
|
||||
@@ -16260,6 +16261,54 @@
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура SQLite_ДобавитьЗаписи(ПараметрыФункции)
|
||||
|
||||
Картинка = ПараметрыФункции["Picture"];
|
||||
OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Картинка); // Картинка - Тип: ДвоичныеДанные
|
||||
|
||||
ФайлКартинки = ПолучитьИмяВременногоФайла("png");
|
||||
Картинка.Записать(ФайлКартинки); // ФайлКартинки - Файл на диске
|
||||
|
||||
База = ПараметрыФункции["SQLite_DB"];
|
||||
Таблица = "test";
|
||||
|
||||
МассивДанных = Новый Массив;
|
||||
|
||||
СтруктураСтроки1 = Новый Структура;
|
||||
СтруктураСтроки1.Вставить("name" , "Vitaly"); // TEXT
|
||||
СтруктураСтроки1.Вставить("age" , 25); // INTEGER
|
||||
СтруктураСтроки1.Вставить("salary" , 1000.12); // REAL
|
||||
СтруктураСтроки1.Вставить("is_active" , Истина); // BOOL
|
||||
СтруктураСтроки1.Вставить("created_at", OPI_Инструменты.ПолучитьТекущуюДату()); // DATETIME
|
||||
СтруктураСтроки1.Вставить("data" , Картинка); // BLOB
|
||||
|
||||
СтруктураСтроки2 = Новый Структура;
|
||||
СтруктураСтроки2.Вставить("name" , "Lesha") ; // TEXT
|
||||
СтруктураСтроки2.Вставить("age" , 20); // INTEGER
|
||||
СтруктураСтроки2.Вставить("salary" , 200.20) ; // REAL
|
||||
СтруктураСтроки2.Вставить("is_active" , Ложь) ; // BOOL
|
||||
СтруктураСтроки2.Вставить("created_at", OPI_Инструменты.ПолучитьТекущуюДату()); // DATETIME
|
||||
СтруктураСтроки2.Вставить("data" , Новый Структура("blob", ФайлКартинки)); // BLOB
|
||||
|
||||
МассивДанных.Добавить(СтруктураСтроки1);
|
||||
МассивДанных.Добавить(СтруктураСтроки2);
|
||||
|
||||
Результат = OPI_SQLite.ДобавитьЗаписи(Таблица, МассивДанных, , База);
|
||||
|
||||
// END
|
||||
|
||||
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьЗаписи", "SQLite");
|
||||
OPI_ПолучениеДанныхТестов.Проверка_SQLiteУспех(Результат);
|
||||
|
||||
Попытка
|
||||
УдалитьФайлы(ФайлКартинки);
|
||||
Исключение
|
||||
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(ОписаниеОшибки(), "Ошибка удаления файла картинки", "SQLite");
|
||||
КонецПопытки
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#КонецОбласти
|
||||
|
Reference in New Issue
Block a user