nixel2007 / entity Goto Github PK
View Code? Open in Web Editor NEWOneScript Persistence API
License: MIT License
OneScript Persistence API
License: MIT License
Чтобы упростить, например, поиск сущностей за счет отсутствия необходимости передавать тип.
Другими словами,
public class EntityManager {
...
getRepository(entityType: T): Repository<T>
...
}
public class Repository<T> {
get(id: any): T[],
get(filter: Map<string, any>): T[],
get(filter: Filter[]): T[],
save(entity: T): void
}
Хотелось бы видеть функционал создания sql запросов в виде конструктора в fluent стиле.
Примеры:
Дано:
Автор
с полями: Код, Имя, Почта, Роль. Таблица бд называется Авторы.Роль
с полями: Код, Имя. Таблица бд называется Роли.Конструктор = МенеджерСущностей.КонструкторЗапросов();
Выборка = Конструктор.Из("Автор") .Где("Код", 1).Выполнить();
Для Каждого ЭлементВыборки Из Выборка Цикл
Сообщить(ЭлементВыборки.Имя);
КонецЦикла;
Возможности:
Из(ИмяСущности)
- метод FROMГде(ИмяПоля, Значение)
, Где(Соответствие)
, Где(Массив)
- метод WHEREВыбрать()
, Выбрать("ИмяСущности.Поле1, ИмяСущности.Поле2, ИмяСущности.Поле3")
, Выбрать(Массив)
- указание выбора определенных полей из запросаОграничить(НомерЗаписи, КоличествоЗаписей)
- метод LIMITЛевоеСоединение(Условие)
, ПравоеСоединение(Условие)
, ВнутренееСоединение(Условие)
, ВнешнееСоединение(Условие)
- методы LEFT JOIN, RIGHT JOIN, INNER JOIN, OUTER JOINУпорядочить(Поле, ПорядокСортировки)
, Упорядочик(Массив)
- метод ORDER BYВыполнить()
- выполнить запросЕще пример (дано такое же):
Выборка = Конструктор
.Из("Автор")
.Выбрать("Автор.Имя, Автор.Почта")
.ЛевоеСоединение("Роль", "Автор.Роль=Роль.Код")
.Выбрать("Роль.Имя")
.Упорядочить("Автор.Имя", ПорядокСортировки.Убывание);
.Выполнить();
Как пример всего этого в других языках: fluentPDO
ОШИБКА - {Модуль lib\entity\src\Классы\ОбъектМодели.os / Ошибка в строке: 357 / Свойство недоступно для записи}
Ругается на Карта https://github.com/nixel2007/entity/blob/master/src/Классы/ОбъектМодели.os#L357
Конфликт с библиотекой https://github.com/sfaqer/collectionos
@nixel2007: Задачу миграции я бы разделил на две больших подзадачи.
С точки зрения разработчика нужно будет класть дто с миграциями в спец папочку и указать в конфиге/коде приложения текущую версию. Всё остальное брал бы на себя энтити.
Над версионированием самой схемы и построения версия-специфичных объектов модели я думал, но кажется это можно отложить на третью очередь разработки, ближе к механизму генерации миграций, но возможно оно понадобится уже на втором шаге, надо побольше покурить.
ВсеФизЛица = МенеджерСущности.Получить(Тип("ФизическоеЛицо"));
Расширить типы для колонки:
&Колонка(Тип = "Тип")
- чтобы в поле можно было положить например Тип("Строка")&Колонка(Тип = "ДвоичныеДанные ")
СтруктураПоиска = Новый Структура("Имя", "Иван");
НайденныеФизЛица = МенеджерСущностей.Получить(Тип("ФизическиеЛица"), СтруктураПоиска);
Что-то среднее между багом и улучшением.
Две таблицы с FK друг на друга не могут быть последовательно созданы - от СУБД придет эксепшен при накладывании констрэйта FK.
Инициализация должна идти по принципу создания таблиц с типами, без контстрейта FK, а потом через ALTER COLUMN уже проставлять FK.
В ТипыКолонок добавить поддержку типа uuid, типа первичный ключ, автогенерируемый.
Цели:
Идентификатор = 123;
ХранилищаСущностей.Удалить(Идентификатор);
Через соединение entity формировать сложные sql запросы.
Варианты от @nixel2007:
Авторы.Выбрать().Где("а = 0").Упорядочить()
Перейти на апт-аддон вместо явного добавления репозитория через командную строку
https://docs.travis-ci.com/user/installing-dependencies/#adding-apt-sources
Возможно стоит вернуться к фабрике менеджеров сущностей, которая сможет возвращать уже проинициализированные менеджеры, не требующие заполнения модели и вызова метода инициализиации
Вынести в отдельную функцию, принимающую в себя текст запроса и необязательное соответствие параметров.
Возвращает ТЗ.
Поскольку в Оскрипт.WEB своя реализация SQLLite, то и коннектор нужен свой.
Нужен некий класс, который позволит описать все поля и допустимые типы полей аннотации, а так же "контракты" - обработчики проверки корректности значений полей аннотации.
Инициализация модели аннотированной сущностью должна выполнять проверку заполнения аннотаций и выдавать внятные исключения при ошибках.
На уровне менеджера просто преобразовывать соответствие в массив ЭлементовОтбора
При использовании автоинкремента в идентификаторах и ПодчиненнаяТаблица, сохранение "главной" сущности выкидывает исключение Внешнее исключение (Microsoft.Data.Sqlite.SqliteException): SQLite Error 19: 'FOREIGN KEY constraint failed'.
Пример кода:
//Файл Источник.os
&ПодчиненнаяТаблица(Тип = "Массив", ТипЭлемента = "ОписаниеПараметра")
Перем Параметры Экспорт;
МенеджерСущностей.ДобавитьКлассВМодель(Тип("ОписаниеПараметра"));
МенеджерСущностей.ДобавитьКлассВМодель(Тип("ОписаниеИсточника"));
МенеджерСущностей.Инициализировать();
Параметр = Параметры.Создать();
Параметр.Имя = "Тест";
Параметр.Значение = "фывыфв";
Параметр.Сохранить();
Источник = Источники.Создать();
Источник.Наименование = "Тест";
Источник.Тип = "Файл";
Источник.Параметры.Добавить(Параметр);
Источник.Сохранить();
В коннекторе SQL Lite нет обработки особождения семафора если Запрос.ВыполнитьКоманду() выкидывает исключение:
@nixel2007: Задачу миграции я бы разделил на две больших подзадачи.
Коннектор состоит из двух реализаций:
ИнформационнаяБаза
для OneScript.Websrc\oscript_modules\entity\src\Классы\КоннекторPostgreSQL.os
Процедура Сохранить()
...
Запрос.ВыполнитьКоманду();
Если ОбъектМодели.Идентификатор().ГенерируемоеЗначение Тогда
Если ЭтоВставкаОбъекта Тогда
...
ЗАМЕНИТЬ НА:
Запрос.ВыполнитьКоманду();
Если ОбъектМодели.Идентификатор().ГенерируемоеЗначение И НЕ ЗначениеЗаполнено(ОбъектМодели.ПолучитьЗначениеИдентификатора(Сущность)) Тогда
Если ЭтоВставкаОбъекта Тогда
...
ЭлементОтбора = Новый ЭлементОтбора("ДатаРождения", ВидСравнения.Меньше, Дата(1990, 1, 1));
НайденныеФизЛица = МенеджерСущности.Получить(Тип("ФизическоеЛицо"), ЭлементОтбора);
МассивОтборов = Новый Массив;
ЭлементОтбора1 = Новый ЭлементОтбора("ДатаРождения", ВидСравнения.Меньше, Дата(1990, 1, 1));
ЭлементОтбора2 = Новый ЭлементОтбора("Имя", ВидСравнения.Равно, "Иван");
МассивОтборов.Добавить(ЭлементОтбора1);
МассивОтборов.Добавить(ЭлементОтбора2);
НайденныеФизЛица = МенеджерСущности.Получить(Тип("ФизическоеЛицо"), МассивОтборов);
Возможность через сущность создавать произвольные индексы таблиц. Например:
Дана сущность Автор
&Идентификатор
&ГенерируемоеЗначение
&Колонка(Тип = "Целое")
Перем Код Экспорт;
Перем УчетнаяЗапись Экспорт;
Перем Имя Экспорт;
Перем ЭлектроннаяПочта Экспорт;
&Сущность(ИмяТаблицы = "Авторы")
Процедура ПриСозданииОбъекта(пКод = Неопределено)
Если ЗначениеЗаполнено(пКод) Тогда
Объект = МенеджерБазыДанных.АвторыМенеджер.ПолучитьОдно(пКод);
Если ЗначениеЗаполнено(Объект) Тогда
ЗаполнитьЗначенияСвойств(ЭтотОбъект, Объект);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Мы хотим создать произвольный индекс по колонке ЭлектроннаяПочта
. Добавляем аннотацию:
&Индекс(Имя = "ПроизвольныйИндекс", Колонки = "ЭлектроннаяПочта")
Подумать над большей потокобезопасностью менеджера сущностей в плане работы с коннектором субд.
вызов двух методов НачатьТранзакцию должен как-то распределяться по разным коннекторам. соответственно и сохранение/получение сущностей должно работать как-то в разных коннекторах.
РандомнаяСущность.os - сущность, где идентификатор:
...
&Идентификатор
&ГенерируемоеЗначение
&Колонка(Тип = "Целое")
Перем Код Экспорт;
...
Какая-то еще НоваяСущность.os с переменной:
...
&ПодчиненнаяТаблица (Тип = "Массив", ТипЭлемента = "РандомнаяСущность")
Перем Коллекция Экспорт;
...
Добавляем в нее через
НоваяСущность.Коллекция = Новый Массив;
НоваяСущность.Добавить(РандомнаяСущность);
После записи НоваяСущность и ее повторного чтения имеем:
НоваяСущность.Коллекция[0] // Значение = 1
Вызвать исключение не меняет код возврата выполнения скрипта:
Line 84 in 41d0967
В данном случае будет код возврата = 0.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.