Russian Qt Forum

Qt => Базы данных => Тема начата: DarkHobbit от Октябрь 24, 2019, 15:03



Название: Кодогенераторы из БД в Qt есть? А если найду?
Отправлено: DarkHobbit от Октябрь 24, 2019, 15:03
Добрый день, форумчане.

QtSql и QSqlQueryModel - это, конечно, хорошо. Но при разработке программ с большим количеством гуя к базам всё равно остаётся чудовищное количество рутины.
А никто не написал кодогенератора? Чтобы на вход ему подать пачку SQL- (точнее, DDL-)файлов с конструкциями CREATE TABLE, а на выходе получить пачку QDialog-ов по редактированию каждой таблицы и структур данных. Ну и фрагментов для кастомизации QSqlQueryModel.

Вроде бы никакого Rocket science тут нет. Из CREATE TABLE и COMMENT ON TABLE можно вытащить и имена полей, и лейблы. Понятно, что дизайн сгенерённого диалога будет ужасен, но его задним числом можно и нужно поправить в QtCreator. Если добавить немного интерактива, то в промежутке между парсингом и генерацией можно указывать, например, какой тип поля мы хотим навязать для столбца, иногда нужна возможность выборы между QLineEdit и QSpinBox, например.

Есть такое? Можно посмотреть и на коммерческое, если цена вменяемая.


Название: Re: Кодогенераторы из БД в Qt есть? А если найду?
Отправлено: vlad-mal от Ноябрь 14, 2019, 23:36
Редактирование отдельных табличек - это слишком просто и практически редко бывает нужно. Обычно интересна более сложная работа, с запросами.

Мне кажется, несложно сделать.
В качестве источника данных использовать базу со словарем. "Словарь" - это совокупность служебных таблиц, описывающих редактирующие запросы.
"Запрос" - именованная абстракция, содержащая метаданные, необходимые для интерактивной работы с БД.
Например, запрос "Документ" включает в себя 4 текстовых поля:
selectSQL
insertSQL
updateSQL
deleteSQL

Поле selectSQL создается либо руками, либо каким-либо построителем запросов, либо генерируется автоматически (для простых случаев типа "одна табличка"), потом парсится средствами используемой СУБД, при это проверяется его корректность (для используемой СУБД) и вытягиваются список возвращаемых полей (и их типы). Проектировщик дополняет список полей вспомогательными данными типа displayLabel, isEditable и т.п.
На основе таких данных генерируются изменяющие запросы (insertSQL, updateSQL, deletSQL), которые при необходимости правятся ручками.
Все, что получилось - обрабатывается специальной утилиткой и создается заготовка, интерфейсный .ui файлик и оболочка к нему на .cpp.

Потом это развить до более сложных случаев - например, до документов типа мастер-деталь, иерархия, а также работа с "вычисляемыми полями" (типа выпадающий список значений FK - таблички для идентификаторов FK - связей)...
...
Можно развить идею ещё дальше - генерировать готовые плагины, содержащие подобные интерфейсные элементы и загружаемые из (базы данных) по мере необходимости в соответствии с правами пользователей... конструктор, ага.  8)
...
Видел готовое на Delphi, когда изучал. Ни разу не пользовался: имхо, быстрее сразу сделать руками то, что нужно, чем править нагенерированное.


Название: Re: Кодогенераторы из БД в Qt есть? А если найду?
Отправлено: DarkHobbit от Декабрь 06, 2019, 08:51
Ни разу не пользовался: имхо, быстрее сразу сделать руками то, что нужно, чем править нагенерированное.

Зависит от 1) качества генерации; 2) масштабов.

Над первым можно и нужно работать (автору кодогенератора в первую очередь). А что до второго... Написание гуёв к БД - это одна из самых рутинных вещей, которые вообще бывают в программировании. Мне довелось этим заниматься по работе несколько лет. Сейчас, к счастью, вернулся на более интересные и низкоуровневые вещи. Но иногда с базами приходится иметь дело. И это совершенно точно не то, чем я хотел бы заниматься до пенсии.

Когда этих формочек в проекте хотя бы несколько десятков - всё проклянёшь и захочешь кодогенерацию, пусть она даже будет не идеальной. А вот продумать, как организовать кодогенерацию, чтобы "правка нагенерённого" была минимальна и содержалась не в исправлении косяков, а исключительно содержательная (улучшение внешнего вида или какая-то уникальная доп. логика) - вот это действительно хорошая творческая задача для автора кодогенератора.

Кодогенератор, кстати, не только из БД пригодился бы. Например, на входе - структура C++. На выходе - класс потомка QDialog с геттером и сеттером, принимающее и отдающее сссылку на эту структуру. (Можно и для QML такое сделать как вариант.) Если это диалог настроек, предусмотреть опцию генерации кода, связывающую её с QSettings. Высший пилотаж - режим обновления, позволяющий обновлять диалог при обновлении структуры без потери ручных правок.

Есть такое или надо писать самому?