Skip to content

autumn-data

Тестирование

autumn-data - это библиотека для простого подключения и работы с базами данных в ОСенних проектах (autumn framework), используя ORM-библиотеку nixel2007/entity и библиотеку наследования nixel2007/extends. autumn-data расширяет возможности entity, приправляя их осенней магией.

Установка

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

sh
opm install autumn-data

Описание

Библиотека autumn-data добавляет следующие возможности над стандартной функциональностью entity:

  • Интеграция с autumn - полная интеграция с контекстом приложения ОСени
  • Автоматическая инициализация менеджера сущностей из конфигурации приложения - сама регистрирует все сущности и настраивает источники данных
  • Регистрация менеджера и хранилищ сущностей как желудей - позволяет легко внедрять хранилища сущностей как зависимости
  • Расширение Хранилища сущностей - добавляет аннотации для создания собственных хранилищ сущностей, наследующих базовые методы от entity
  • Автогенерация запросов - автоматическое создание запросов к базе данных на основе имен добавленных методов

Быстрый старт

1. Определение сущности

bsl
&Идентификатор
&Колонка(Тип = "Целое")
Перем Идентификатор Экспорт;

&Колонка(Тип = "Строка", Длина = 100)
Перем Имя Экспорт;

&Сущность(ИмяТаблицы = "Пользователи")
Процедура ПриСозданииОбъекта()
КонецПроцедуры

2. Настройка источника данных

Создайте файл autumn-properties.json в корне вашего проекта и добавьте секцию для источников данных:

json
{
    "data": {
        "ИсточникиДанных": {
            "ТипКоннектора": "КоннекторSQLite",
            "СтрокаСоединения": "Data Source=database.db"
        }
    }
}

ОСень автоматически подхватит настройки из этого файла при запуске приложения.

3. Базовое использование

bsl
#Использовать autumn
#Использовать autumn-data
#Использовать "."

Поделка = Новый Поделка();
Поделка.ЗапуститьПриложение();

// Желудь "ХранилищеСущностейПользователи" автоматически регистрируется
// при запуске приложения на основании типа &Сущности "Пользователь"
Хранилище = Поделка.НайтиЖелудь("ХранилищеСущностейПользователь");
Пользователь = Хранилище.ПолучитьОдно(123);

TIP

Не останавливайтесь на базовом использовании! Библиотека autumn-data предоставляет расширенные возможности для работы с базами данных, включая расширение функциональности хранилищ сущностей и автоматическую генерацию методов запросов. Подробнее в следующих разделах документации.

Основные концепции

Сущности

Сущности - это классы, которые представляют таблицы в базе данных. Они помечаются аннотацией &Сущность.

Хранилища сущностей

Хранилища - это классы-репозитории, которые предоставляют методы для работы с сущностями. Хранилища сущностей бывают двух видов:

  1. Предоставляемые библиотекой entity.
  2. Создаваемые пользователем, расширяющие возможности хранилищ из entity. Они помечаются аннотацией &ХранилищеСущностей.

Для работы с autumn-data вам не обязательно создавать собственные &ХранилищеСущностей, так как библиотека автоматически создает хранилища для всех сущностей, зарегистрированных в приложении. Однако это может быть полезно для добавления специфических методов или логики.

Методы запросов

Методы, помеченные аннотацией &МетодЗапроса, автоматически получают реализацию на основе своего имени. Поддерживаются различные паттерны имен методов для создания запросов.

Дальнейшее изучение

Руководство пользователя

Справочник API

Лицензия

Этот проект лицензируется под лицензией MIT. Подробности см. в файле LICENSE.md.


Настройка источников данных

Библиотека autumn-data поддерживает работу с множественными источниками данных через конфигурацию в рамках autumn framework.

Основные понятия

Источник данных

Источник данных определяет подключение к конкретной базе данных. Каждый источник данных имеет:

  • Имя - уникальный идентификатор источника
  • Тип коннектора - класс коннектора для подключения к БД
  • Строку соединения - параметры подключения к БД
  • Параметры коннектора - дополнительные параметры

Менеджер сущностей

Менеджер сущностей управляет моделью данных для конкретного источника данных и предоставляет хранилища сущностей.

Конфигурация одного источника данных

Как json

json
{
    "data": {
        "ИсточникиДанных": {
            "Основной": {
                "ТипКоннектора": "КоннекторSqlite",
                "СтрокаСоединения": "Data Source=database.db"
            }
        }
    }
}

При такой конфигурации создается источник данных "Основной", и все хранилища будут использовать его по умолчанию. Дополнительно хранилища и менеджер сущностей будут доступны без указания имени источника данных.

Как массив с одним элементом

bsl
Детальки = Новый Соответствие();

СекцияData = Новый Соответствие();
Детальки.Вставить("data", СекцияData);

ИсточникиДанных = Новый Соответствие();
СекцияData.Вставить("ИсточникиДанных", ИсточникиДанных);

ИсточникиДанных.Вставить("ТипКоннектора", "КоннекторSQLite");
ИсточникиДанных.Вставить("СтрокаСоединения", "Data Source=database.db");

СоветДругогоМастера = Новый СоветДругогоМастера();
СоветДругогоМастера.ЗначенияДеталек(Детальки);

Поделка = Новый Поделка(СоветДругогоМастера);
Поделка.ЗапуститьПриложение();

При такой конфигурации создается источник данных "Основной", и все хранилища будут использовать его по умолчанию. Дополнительно хранилища и менеджер сущностей будут доступны без указания имени источника данных.

Как соответствие

bsl
Детальки = Новый Соответствие();

СекцияData = Новый Соответствие();
Детальки.Вставить("data", СекцияData);

ИсточникиДанных = Новый Соответствие();
СекцияData.Вставить("ИсточникиДанных", ИсточникиДанных);

ИсточникиДанных.Вставить("Имя", "МойИсточник");
ИсточникиДанных.Вставить("ТипКоннектора", "КоннекторInMemory");

СоветДругогоМастера = Новый СоветДругогоМастера();
СоветДругогоМастера.ЗначенияДеталек(Детальки);

Поделка = Новый Поделка(СоветДругогоМастера);
Поделка.ЗапуститьПриложение();

При такой конфигурации создается источник данных "МойИсточник". При обращении к хранилищам сущностей, менеджеру сущностей и в описаниях сущностей нужно будет явно указывать имя источника данных.

Конфигурация множественных источников данных

Как json

json
{
    "data": {
        "ИсточникиДанных": [
            "Основной": {
                "ТипКоннектора": "КоннекторSQLite",
                "СтрокаСоединения": "Data Source=main.db"
            },
            "Дополнительный": {
                "ТипКоннектора": "КоннекторPostgreSQL",
                "СтрокаСоединения": "Host=localhost;Database=testdb;Username=user;Password=pass"
            }
        ]
    }
}

Как массив с несколькими элементами

bsl
Детальки = Новый Соответствие();

СекцияData = Новый Соответствие();
Детальки.Вставить("data", СекцияData);

ИсточникиДанных = Новый Массив();
СекцияData.Вставить("ИсточникиДанных", ИсточникиДанных);

ИсточникДанных = Новый Соответствие();	
ИсточникДанных.Вставить("Имя", "Основной");
ИсточникДанных.Вставить("ТипКоннектора", "КоннекторInMemory");

ИсточникиДанных.Добавить(ИсточникДанных);

ИсточникДанных = Новый Соответствие();
ИсточникДанных.Вставить("Имя", "Дополнительный");
ИсточникДанных.Вставить("ТипКоннектора", "КоннекторSQLite");
ИсточникДанных.Вставить("СтрокаСоединения", "FullUri=file::memory:?cache=shared");

ИсточникиДанных.Добавить(ИсточникДанных);

СоветДругогоМастера = Новый СоветДругогоМастера();
СоветДругогоМастера.ЗначенияДеталек(Детальки);

Поделка = Новый Поделка(СоветДругогоМастера);
Поделка.ЗапуститьПриложение();

При задании нескольких источников данных кодом доступен только вариант с массивом.

Указание источника данных для сущности

Если используется только один источник данных без явного указания имени, то по умолчанию сущности будут использовать его. Для указания конкретного источника в режиме работы с несколькими источниками данных используйте параметр ИсточникДанных в аннотации &Сущность:

bsl
// Использует единственный источник данных
&Сущность(ИмяТаблицы = "Пользователи")
Процедура ПриСозданииОбъекта()
КонецПроцедуры

// Использует явно указанный дополнительный источник данных
&Сущность(ИмяТаблицы = "Документы", ИсточникДанных = "Дополнительный")
Процедура ПриСозданииОбъекта()
КонецПроцедуры

Указание источника данных для хранилища сущностей

Аналогично для хранилищ сущностей:

bsl
// Хранилище для единственного источника данных
&ХранилищеСущностей("Пользователь")
Процедура ПриСозданииОбъекта()
КонецПроцедуры

// Хранилище для дополнительного источника данных
&ХранилищеСущностей("Документ", ИсточникДанных = "Дополнительный")
Процедура ПриСозданииОбъекта()
КонецПроцедуры

Получение хранилищ из контейнера

При использовании множественных источников данных хранилища регистрируются в контейнере с составными именами:

bsl
// Для основного источника
ХранилищеПользователей = Поделка.НайтиЖелудь("ХранилищеСущностейОсновнойПользователь");

// Для дополнительного источника  
ХранилищеДокументов = Поделка.НайтиЖелудь("ХранилищеСущностейДополнительныйДокумент");

// Также можно использовать прозвища
ХранилищеПользователей = Поделка.НайтиЖелудь("ХранилищеСущностейОсновной");
ХранилищеДокументов = Поделка.НайтиЖелудь("ХранилищеСущностейДополнительный");

Поддерживаемые типы коннекторов

Библиотека поддерживает все коннекторы из библиотеки entity:

  • КоннекторSQLite
  • КоннекторPostgreSQL
  • КоннекторJSON
  • КоннекторInMemory (для тестирования)
  • И другие коннекторы, поддерживаемые entity

Параметры коннектора

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

json
{
    "data": {
        "ИсточникиДанных": {
            "Дополнительный": {
                "ТипКоннектора": "КоннекторPostgreSQL",
                "СтрокаСоединения": "Host=localhost;Database=testdb",
                "ПараметрыКоннектора": [      
                    "дополнительный_параметр"
                ]                             
            }
        }
    }
}
bsl
Детальки = Новый Соответствие();

СекцияData = Новый Соответствие();
Детальки.Вставить("data", СекцияData);

ИсточникиДанных = Новый Соответствие();
СекцияData.Вставить("ИсточникиДанных", ИсточникиДанных);

ИсточникиДанных.Вставить("ТипКоннектора", "КоннекторSQLite");
ИсточникиДанных.Вставить("СтрокаСоединения", "Data Source=database.db");

ПараметрыКоннектора = Новый Массив();
ПараметрыКоннектора.Добавить("дополнительный_параметр");
ИсточникиДанных.Вставить("ПараметрыКоннектора", ПараметрыКоннектора);

СоветДругогоМастера = Новый СоветДругогоМастера();
СоветДругогоМастера.ЗначенияДеталек(Детальки);

Поделка = Новый Поделка(СоветДругогоМастера);
Поделка.ЗапуститьПриложение();

Методы запросов

Одной из ключевых особенностей autumn-data является автоматическая генерация реализации методов запросов на основе их имен. Методы, помеченные аннотацией &МетодЗапроса, анализируются библиотекой, и для них генерируется соответствующий код выполнения запроса. Для использования аннотации &МетодЗапроса необходимо, чтобы класс был помечен аннотацией &ХранилищеСущностей.

Принцип работы

Метод, помеченный аннотацией &МетодЗапроса, должен:

  1. Следовать определенным соглашениям об именовании
  2. Иметь соответствующие параметры

Например:

bsl
&МетодЗапроса
Функция ПолучитьПоИмяРавно(Имя) Экспорт
    Возврат Неопределено; // Реализация будет сгенерирована автоматически
КонецФункции

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

bsl
Функция ПолучитьПоИмяРавно(Имя) Экспорт
    ОпцииПоиска = Новый ОпцииПоиска();
    ОпцииПоиска.Отбор("Имя", ВидСравнения.Равно, Имя);
    Возврат ХранилищеСущностей.Получить(ОпцииПоиска);
КонецФункции

Структура имени метода

Имя метода состоит из следующих частей:

  1. Режим поиска - Получить или ПолучитьОдно
  2. Ограничения (опционально) - Первые, СоСмещением
  3. Условия отбора - По[Поле][ВидСравнения]
  4. Сортировка (опционально) - УпорядочитьПо[Поле][Направление]

Режимы поиска

  • Получить - возвращает коллекцию объектов
  • ПолучитьОдно - возвращает один объект или Неопределено

Ограничения

  • Первые - ограничивает количество возвращаемых записей
  • СоСмещением - пропускает указанное количество записей с начала

Виды сравнения

  • Равно (по умолчанию) - точное совпадение
  • НеРавно - не равно
  • Больше - больше
  • БольшеИлиРавно - больше или равно
  • Меньше - меньше
  • МеньшеИлиРавно - меньше или равно
  • В - значение в списке
  • НеВ - значение не в списке

Направления сортировки

  • Возр (по умолчанию) - по возрастанию
  • Убыв - по убыванию

Примеры методов

Простые запросы

bsl
// Найти пользователя по ID
&МетодЗапроса
Функция ПолучитьОдноПоИдентификаторРавно(Идентификатор) Экспорт
    Возврат Неопределено;
КонецФункции

// Найти пользователей по имени
&МетодЗапроса
Функция ПолучитьПоИмяРавно(Имя) Экспорт
    Возврат Неопределено;
КонецФункции

Сложные условия

bsl
// Пользователи старше указанного возраста
&МетодЗапроса
Функция ПолучитьПоВозрастБольше(Возраст) Экспорт
    Возврат Неопределено;
КонецФункции

// Пользователи с именем из списка
&МетодЗапроса
Функция ПолучитьПоИмяВ(СписокИмен) Экспорт
    Возврат Неопределено;
КонецФункции

// Активные пользователи
&МетодЗапроса
Функция ПолучитьПоАктивенРавно(Активен) Экспорт
    Возврат Неопределено;
КонецФункции

Множественные условия

bsl
// Пользователи по имени и возрасту
&МетодЗапроса
Функция ПолучитьПоИмяРавноИВозрастБольше(Имя, Возраст) Экспорт
    Возврат Неопределено;
КонецФункции

// Активные пользователи определенного возраста
&МетодЗапроса
Функция ПолучитьПоАктивенРавноИВозрастМеньшеИлиРавно(Активен, Возраст) Экспорт
    Возврат Неопределено;
КонецФункции

Сортировка

bsl
// Пользователи, отсортированные по имени
&МетодЗапроса
Функция ПолучитьУпорядочитьПоИмяВозр() Экспорт
    Возврат Неопределено;
КонецФункции

// Пользователи по возрасту, отсортированные по дате создания (убывание)
&МетодЗапроса
Функция ПолучитьПоВозрастБольшеУпорядочитьПоДатаСозданияУбыв(Возраст) Экспорт
    Возврат Неопределено;
КонецФункции

Ограничения

bsl
// Первые 10 пользователей
&МетодЗапроса
Функция ПолучитьПервые(Количество) Экспорт
    Возврат Неопределено;
КонецФункции

// Пользователи с пропуском первых N записей
&МетодЗапроса
Функция ПолучитьСоСмещением(Смещение) Экспорт
    Возврат Неопределено;
КонецФункции

// Пагинация: первые N записей со смещением
&МетодЗапроса
Функция ПолучитьПервыеСоСмещением(Количество, Смещение) Экспорт
    Возврат Неопределено;
КонецФункции

Комплексные запросы

bsl
// Сложный запрос с множественными условиями, сортировкой и ограничениями
&МетодЗапроса
Функция ПолучитьПервыеСоСмещениемПоАктивенРавноИВозрастБольшеИлиРавноУпорядочитьПоДатаСозданияУбыв(
    Количество,
    Смещение, 
    Активен, 
    Возраст
) Экспорт
    Возврат Неопределено;
КонецФункции

Соответствие параметров

Параметры метода должны соответствовать порядку их появления в имени метода:

  1. Сначала идут параметры ограничений (Первые, СоСмещением)
  2. Затем параметры условий отбора в порядке их следования в имени
  3. Параметры сортировки не требуются, так как поля сортировки указываются в имени

Например, для метода:

bsl
ПолучитьПервыеСоСмещениемПоИмениРавноИВозрастБольшеУпорядочитьПоДатаСозданияУбыв(Количество, Смещение, Имя, Возраст)

Порядок параметров:

  1. Количество - для ограничения Первые
  2. Смещение - для ограничения СоСмещением
  3. Имя - для условия ПоИмениРавно
  4. Возраст - для условия ИВозрастБольше

Ограничения

  • Не все комбинации условий и ограничений могут быть поддержаны
  • Для сложных запросов рекомендуется использовать прямые вызовы ХранилищеСущностей-родителя с объектом ОпцииПоиска