|
|
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
Максим НЯ о том, что можно определить структуру как угодну, какую нужно, ограничений нет (в рамках разумного конечно), а затем в рамках этой структуры создавать объекты, работать с ними, контроллировать их.Японцы, напомню, программу ИИ так и не осилили. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2013, 20:54:26 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
PSV100Ты как-то давал ссылку на пример стандарта разработки БД, некий официальный от Oracle. Насколько я понимаю, твоя первичная цель организовать поддержку ведения подобной разработки. Но в таком виде, имхо, мало кто сможет пользоваться этой тулзой. Да, это был один из первых мне попавшихся документов, посвященных организации разработки БД. Не синтаксису ("табличка создается таким оператором, хранимая процедура таким и т.д."), а именно так сказать "хозяйственной" части. Как хранить код, как называть объекты. Кстати автор данной статьи так же сравнивает "доставание" объектов из СУБД с декомпиляцией бинарных файлов приложения. Еще у этого автора есть интересный проект (кстати представленная документация это часть данного проекта), это PL SQL фреймворк, универсальный каркас для приложений БД, с продуманными заранее стандартными вещами и функционалом. Но почему то такие вещи пользуются достаточно малой популярностью. В том же мире Java (и нетолько) существует куча всяких фреймворков и всяких "наростов" и прибамбасов вокруг них, которые позволяют человеку может не очень сведующему в разработке, начинающему, уже на отточеном продуманном каркасе построить свое приложение, доработав его нужым кодом. Т.е. практически не заниматься организационными делами, а только функционалом. (И кстати не всегда это спрятано в ГУИ, можно легко использовать свой полюбившийся редактор(иде) и утилиты). Там уже все продумано, модели хранятся здесь, контроллеры здесь, а вот представления там, дата классы там ну и т.д. Взять тот же самый Play Framework. И плюс к таким вещам есть куча заточенных специально под них инструментов и библиотек, которые легко и предсказуемо пристегиваются к вашему приложению. Т.е. разработка ведется не с нуля и не на останках предыдущего (или чьего-нибудь) проекта, где есть похожий нужный функционал и подходяшая архитектура. PSV100Все хотят как можно меньше возни и больше удобств. Рассмотрим тех, кто работает в GUI-DBIDE. Сначала нужно запустить в консоли jar-ник, чтобы создать новый объект, для чего будет создан файл с шаблоном и/или каталог, или в каком-то файле чего-то нового добавиться. Теперь в GUI нужно открыть этот файл, его редактировать, сохранить, выполнить и пр. Как правило, такая возня в GUI-IDE утомительна. DB-IDE, фактически, не занимаются ведением файловой структуры, обычно текстовые файлы для них - это просто импорт/экспорт содержимого текстового редактора в каком-то GUI-режиме. Поэтому, в основном, и предпочитают работать уже именно в GUI - где-то кликнули, на основе шаблонов для именования объектов вылазит какой-то режим, где вводят структуру таблицы или т.п., или создаётся в текстовом редакторе шаблон для правки содержимого будущего объекта, и т.д. Сразу всё сохраняется в БД, могут быть средства для организации проектов внутри БД (объединения объектов по своим кучам), свой контроль версий и история, распределение доступа по разработчикам и т.д. Одним словом, если уж GUI, то проще в нём же и ковыряться. Некоторые только ими и обходятся, натравили инструмент на сравнение двух баз - всё автоматом обновилось или создали скрипт для наката. Кто-то создаёт дамп БД, кладёт на всякий случай где-то рядом. Кто-то отдельно складывает sql-скрипты по папочкам, на основе утверждённого стандарта, или/и складывает скрипты для всяких накатов версий или для дополнительной обработки БД после создания или правки. Но в этом случае уже проще из GUI выгрызать нужные тексты и кидать их в файлы, т.к. GUI упрощает их создание (тут только контекстно-зависимый автокомплит может заставить работать именно с GUI). Но, обычно мало кого волнует в каком виде будут конечные тексты. Некоторым они просто нужны по принципу "чтобы было" (ну, может иногда СКВ дадут где-то конфликт правки одного и того же объекта, к примеру), в любом случае, отношение к ним где-то на уровне просто как списку команд, чтобы выполняли молча свои действия и всё, нет с ними работы как с первичным материалом. С ребятами ИДЕшниками, все понятно. Если ГУИ полностью устравивает, подходит под задачи и ничего большего не требуется, то почему нет. Я и не пытаюсь сказать что это плохо, "так никто не делает" или "а давайте делать так". Просто если в проекте БД это немного нечто большее чем набор плоских табличек, забитых под мощным гнетом ОРМ, то тогда можно посмотреть на ее разработку с другой стороны, например (как всего лишь один из вариантов) как в рассматриваемой тулзе. PSV100Те, кто работает с SQL-исходниками именно как с исходным материалом. Обычно их заставляет жизнь, т.к. требуется широкий и гибкий функционал, некоторая инвариантность (не обязательно глобального функционала, например, нужно создавать БД с тестовыми или первичными данными в разных вариантах или без них и т.п.). Некоторым просто удобнее работать в текстовом редакторе или какой-то не DB-IDE, рядом с разработкой клиентской для базы части. И т.д. Короче говоря, задача создания новых файлов для новых объектов по определенным правилам при необходимости решается через редактор/IDE (и даже удобнее, скажем, дал команду - сформировался каталог с файлом, файл загрузился в буфер и сразу запустился интерактивный сниппет а-ля как в ТекстМейте). Задача удаления файлов или части файла согласно операции удаления объекта в БД автоматом решается лишь частично, не всегда есть только явные технические связи, частенько хватает и логических отношений, а всего сразу не наконфигурируешь. И задача реорганизации исходников в иную форму тоже автоматом выполнима лишь отчасти, опять же, если учитывать прикладную логику в проекте. Задачу верификации исходников очень и очень маловероятно решить только на универсальных настройках с ограниченным понятием отношений. Все зависит от проекта и его сложности. Может удалить или переконвертить явно 100% и не получится, но как минимум тулза может показать, что при удалении этого объекта у вас есть еще несколь зависимых объектов, которые без него будут невалидными и предлагает их удалить тоже или отменить текущую операцию. Т.е. некторый каркас, помощник, некое воплощение(частичное хотябы) Регламента разработки. PSV100Иными словами, выше перечисленные задачи на практике второстепенны или имеются способы их решений (а ту же задачу анализа кода такой инструмент вряд ли решит или совсем чуть-чуть, но хоть что-то). Поэтому ради этих функций на такую утилиту вряд ли массово посмотрят. Основная задача при работе с sql-исходниками - это их "компиляция", т.е. создание БД и её модификация, плюс решение вспомогательной рутины. Более того, именно эта "компиляция" - ключевой момент, это основа основ для ведения каталога исходников, именно это и предопределяет всю пляску вокруг исходников, и часто диктует правила, как эти исходники оформлять. И если инструмент для исходников не обеспечивает решение для компиляции/сборки, то он мало будет востребован. Компиляция/сборка это основная функция для меня. Т.е. мне нужен инструмент, которому я скажу: "мне нужны PLSQL пакеты PERSONS_MANAGER и SALARY_MANAGER, а так же все пакеты из модуля <<заработная плата>>, и еще все пакеты из модуля <<налоговый учет>>, которые были созданы не раньше чем 2 дня назад" (вполне реальная задача), а на выходе получить готовый скрипт, где пакеты будут в нужном мне порядке (например сначала заголовки, а потом тела), в начале будут вставлены подготовительные скрипты (например включение логирования, всяких режимов там, команды утилите-сборщику (например sqlplus-операторы)), а в конце завершающие операторы (отображение ошибок, регистрация чего нибудь). Так же вставлять чего-нибудь между скриптами (нгапример если я храню оракловые пакеты без завершающего слеша, то в скрипте для sqlplus'а, они должны быть с ним). Да придется потратить некоторое время на описание структуры, но в будущем это позволит сэкономить много времени и нервов. Если получится обойтись без xml (или с его минимумом), а только разбором sql-операторов, то буду только рад. PSV100Ну а чтобы решить задачи компиляции/сборки через такую утилиту при её таком подходе, универсальном и настраиваемом, естественно требуется дальнейшее развитие. А вот развитие весьма проблематичное. Сейчас в конфигурационных настройках не хватает гибкости, кроме явной технической связи между элементами как объектами БД необходима "шаблонизация" для задания логики разбиения по прикладным модулям (это востребовано). Чтобы создавать БД необходимо понимать смысл каждого элемента, или нужна их взаимосвязь и нужно определять очерёдность создания элементов. Причём нужны настройки для очерёдности не только согласно их типам (т.е. сначала нужно создавать таблицы, затем индексы и отношения, заголовки процедур, пакетов и пр., затем их тела и т.д.), но и может потребоваться явная последовательность для элементов одного вида (например, правильно располагать какие-то блоки кода, которые выполняются после создания или накатов и т.п., или накаты через всякие alter-ы с возможной правкой отношений или связанных объектов, и т.д.). Поэтому, уже есть какая-то потребность в шаблонной последовательности (кроме явной организации элементов внутри файла), пусть будет нумерация на уровне файлов (т.е. 01_sqript1.sql, 02_script2.sql), и это должно как-то настраиваться. Далее, если закладываться на какую-то инвариантность, то нужны какие-то признаки для элементов. Поскольку "Start/Stop-text" - это метки для поиска "в лоб", то остаётся использовать признаки на уровне файлов, например, как в DbMaintain (т.е. аннотации через "@" или "#", их может быть несколько), или дорабатывать метки "Start/Stop-text". Тогда появляется возможность задать какие-то варианты сборки исходников, или кроме сборок баз можно писать сценарии для вспомогательных рутин, например, извлечь только тестовые данные для таблиц (плюс код для предварительного их удаления) и т.п. Здесь тоже соглашусь. Я думал (и немного писал уже) о планируемом механизме сортировки и отбора объектов и их элементов (на сонове неких шаблонов, по дате модификации, по алфавиту и т.д., здесь нужна особенная гибкость), но это пока не реализовано. Решение в лоб в ввиде start(stop)Text, поля priority это временные базовые решения, сделанные для того, чтобы показать как примерно утилита будет работать, для чего она нужна, чтобы можно было пощупать. Ну а когда под рукой есть что осязаемое, то и новые мысли и старые проблемы становятся более ясными. То что есть сейчас это не более чем прототип. PSV100По своему опыту. Такое развитие я уже проходил, был концептуально фактически похожий велосипед, и пришлось утонуть в бесконечной шаблонизации. Частично такой подход решает проблемы, но не все и задалбывает конкретно. Прямое программирование "в лоб" оказалось проще, естественнее и быстрее, без всякой xml- и подобных конфигураций, всё на основе стандартных sql-операторов. Я уже давал раньше ссылки и что-то где-то выкладывал, но опять ниже выложу всё сразу до кучи - пример некоего стандарта для разработки БД. Фактически, там организация проекта похожа на тот стандарт от оракл (ссылка выше), за исключением возможной разбивки исходников по подпроектам и есть явная последовательность сборки (через операторы "input", аналог "start"-а). Плюс натравливается велосипед-препроцессор и получаем разные варианты сборок БД и сборок скриптов-сценариев для рутины. В результате - гибкость, и инструмент даёт полную свободу под конкретные нужды. Недостаток - есть явное ручное описание этих "input-ов", причём из-за них как бы имеются общие файлы между разработчиками, но конфликты их правки разруливаются фактически автоматом. Ну и неплохо иметь какой-то плагин где-то, который помогает чего-то sql-генерировать, в т.ч. создавать новые файлы и шаблоны и эти start/input и т.д., SQL - тяжкая хрень. Когдато давно у меня была идея БД-фреймворка (реализованного под конкретную СУБД на ее sql-диалекте), что то наподобие того, что указано в ссылке в начале этого письма. Т.е. где бы модули и объекты были описаны в самой БД, в специальных табличках. Т.е. в базах есть всячиские системные таблицы и представления, где хранится физическое описание объектов, а вот как они логически ораганизованы базе не интересно. В частности на одной из моих работ была частично реализована така вещь: Каждый создаваемый объект БД должен был пройти через специальную регистрацию (вызов спец. процедуры с имененем объкта и прочими параметрами), там на него выдавались нужные права, прописывался в служебных таблицах ну и много других штук. Нет регистрации нет объекта, его не увидит приложение, не будет доступа к функционалу и т.д. Не было в этой схеме логической принадлежности. Т.е. чтобы я с служебной таблице добавить запись о новом модуле, а создавать и регистрировать объекты именно для этого модуля. Ну и со всеми вытекающими. Но потом я как то охладел к это идее (во первых она полность СУБД-зависимая) и загорелся тем, о чем мы сейчас с вами разговариваем. Вариант с файлами мне кажется более естественным. PSV100Но нужно ещё подумать об удобной организации разбивки исходников по прикладным модулям/подмодулям с зависимостями, где в каждом модуле нужно вести свою "datamodel", причём так, чтобы достаточно было иметь только базовый "create table ..." и грамотно расположены связанные "alter" (тут всё-таки есть потребность в явной последовательности операций, причём перемешанной вокруг разных объектов, например, если СУБД не позволяет удалить используемый столбец, то предварительно нужно зависимые объекты сделать пустыми, чтобы убрать эту зависимость). Плюс для "инвариантности" можно подогнать "велопрепроцессор". На счет альтеров это больной для меня вопрос, но не менее важный. Было бы здорво иметь базовый скрипт и организованный набор алтеров, а потом получить общий скрипт создания таблицы (я не говорю о чистом create, хотя бы просто сумму файлов). Т.е. я набираю в консоле утилиту и имя объекта, а получаю в нужном месте файлик с определенным именем и версией для записи в него модифицирующих операторов. А потом говорю: "собери мне скрипты создания/модификации этой таблицы с момента создания по конец прошлого года" и он покажет. PSV100Но для реализации такой тулзы нужен полноценный разбор текста, причём нужны расширения как плагины, понимающие конкретный sql-диалект и потроха СУБД. Тогда возможно и решение смежных задач, вида поддержки доков-комментариев, создание скриптов как "create" в последней или нужной версии (т.е. все alter-ы свёрнуты в общий итог) и т.д. Возможно форматирование исходников и их реструктуризация (управляемая), а также и некоторая верификация. А если уж говорить о создании полноценного db-tools, то очень не хватает подобным инструментам интерактивности. Т.е. чтобы можно было запустить сервер, как emacs или JEdit, он постоянно висит себе и держит соединения с БД, к нему коннектишься, по своему протоколу или хоть с комстроки, хоть по rest-у и пр., он динамически выполняет sql-запросы, управляет каталогом sql-исходников, даёт автокомплит и т.д. И тогда пиши себе плагин хоть для иклипса, хоть для vim-а и пр., или вэб делай. Но это всё мечты и мысли в слух. А так, я это всё к тому, чтобы дать рекомендацию. Если разрабатываемая утилита удовлетворит какие-то свои конкретные потребности, то и хорошо, и увлекаться глобальной и супер-шаблонизацией особо нет смысла. Согласен, для полноценного инструмента нужен полный модульный расширяемый разбо sql-кода. На счет интерактивности и сервера это классная идея, не хватает такого инструмента. В частности при разработки нужно время от времени накатывать скрипты на разные базы (у меня например их число доходит до 4-5 баз: база для разработок, общая база для разработок и 2-3 тестовых (разных версий, т.к. в продакшене тоже разные версии)). Да и вообще много чего можно было бы оптимизировать и упростить. Утилиту я начинал делать для себя, под конкретные нужды, но дальше больше, разгораются новые идеи и мысли, вспоминаются проблемы и хотелки. Т.е. если у данного тулза будет заинтересованность, то можно поработать и над универсальность и масштабируемостью. Причем код (точнее пока только прототип) в открытом доступе (пулл реквесты, коммитерство, а может быть даже содание нового другого репозитория - легко, вообще не вопрос), если у кого будет в нем потребность и желание что то добавить/изменить (а может и вообще кардинально переделать), то буду категорически за. Вобщем все вопросы и предложения только приветсвуются. Тем более совместными усилиями можно будет сделать более универсальный инструмент для большого (в узких круга )) ) числа пользователей. (надеюсь намек понят)) ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2013, 22:36:46 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
Petro123Максим НХранение и организацию алтеров таблицы (добавление полей) я пока не рассматриваю Это как? Это важнейший элемент апдейта БД у заказчика..... Например, увеличился размер поля ИНН. Не рассматриваю пока , это следующий этап, но об этом уже было написано в этой теме, в частности PSV100 предлагал интересные решения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2013, 22:41:06 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
Petro123Максим Нто вручную организационно все отследить и переделать будет достаточно проблематично (в зависимости от проекта конечно). код на SQL (кто его любит )) ) ничем не отличается от простынки кода на Java. Как отслеживают код на Java без твоей утилиты? У явы болле развитая инфраструктура (что не удивительно), куча всяких сборщиков, фреймворком и крутых IDE. У разработки БД свои нюансы и свои исторически сложившиеся особенности (о них мы тут тоже много говорили). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2013, 22:45:11 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
авторЯ смогу запустить тулзу и проверить созданный код на соответствие заданной структуре. А еще я могу организовать ночные билды (полную или частичную сборку базы из исходников) на основании этой тулзы и описанных типов объектов, и если база не соберется, то будет видно кто накосячил. Ну когда неделю, месяц, квартал поэксплуатируете - отпишитесь. Как прошло внедрение. Это база. А клиент то к ней на чем? Как взаимодействуют структура базы, хранимки, слой бизнес-логики, слой презентации, слой нормативно-справочной информации? Как увязано с управлением требованиями к софту? Есть ли юнит-тестирование или аналоги? Что есть критерий того что ==база собралась==? ТЕ интересно применение в широком контексте. пока как то видится, что инструмент покрывает узкую зону которую и покрывать автоматизацией не так уж обязательно - опубликовали регламент на стандарт разработки, выложили типовые шаблоны.... и применить административный ресурс. И все. Копипаст файлов - папок + сниппеты = счастье. Маленькое, а большого и данная утилита не подарит? вроде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2013, 09:58:35 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
Vladimir BaskakovНу когда неделю, месяц, квартал поэксплуатируете - отпишитесь. Как прошло внедрение. Если все таки заюзаюсь, то отпишусь конечно. Vladimir BaskakovЭто база. А клиент то к ней на чем? Как взаимодействуют структура базы, хранимки, слой бизнес-логики, слой презентации, слой нормативно-справочной информации? Как увязано с управлением требованиями к софту? Есть ли юнит-тестирование или аналоги? Я о таких глобальных вещах еще не думал... Юнит тестирование оно и в Африке юнит тестирование. Вы можете создать например элемент "Юнит тест" для типа объекта "Пакет" или процедура и он будет однозначно идентифицирован. Можно будет гонять тесты для конкретных пакетов, модулей, выборочно и т.д. Ну а написание юнит теста это уже задача разработчика. Тулза может подставить сниппет для конкретного типа. Vladimir BaskakovЧто есть критерий того что ==база собралась==? Отсутствие ошибок сборки и выполнение юнит-тестов (или каких-либо других тестов). Vladimir BaskakovТЕ интересно применение в широком контексте. Мне тоже... Vladimir Baskakovпока как то видится, что инструмент покрывает узкую зону которую и покрывать автоматизацией не так уж обязательно - опубликовали регламент на стандарт разработки, выложили типовые шаблоны.... и применить административный ресурс. И все. Копипаст файлов - папок + сниппеты = счастье. Маленькое, а большого и данная утилита не подарит? вроде. Пока так, но если объектов много, с ними ведется активная работа, нужна автоматическая сборка разных типов, то и это будет являться неплохим подспорьем (естественно имхо) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2013, 17:01:46 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
Максим НСогласен, для полноценного инструмента нужен полный модульный расширяемый разбо sql-кода. Ну, глубокий и полноценный разбор SQL может и не нужен (а точнее, очень тяжело реализовать), а вот хоть какой-то обязательно нужен. Предложенный прототип, фактически, мало на что годен. Вот код по мотивам твоих примеров: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. Здесь имеются грабли, из-за которых нужно "стучать по шапке" согласно настроенной конфигурации проекта, а утилита этого никак не поймёт: - "primary key" находится не в секции "constraints"; - "create index" не расположен в секции "index ddl" и вообще ни в какой секции. Иными словами, без понимания того, что именно находится внутри sql-файла, ни о каком реальном анализе и контроле кода речи быть не может. Далее, утилита не понимает связи между секциями, т.е. если в файле будут ещё таблицы, то понять где какие "constraint"-ы и прочие всякие индексы, т.е. что к чему и к какой таблице принадлежит, не возможно. Фактически, кроме управления списком файлом, внутри самого файла утилита может лишь вырезать все "таблицы", все "индексы" и т.д. Короче говоря, я предлагаю отталкиваться от того, что каждый sql-файл нужно резать на секции, которые явно как-то задаются (даже если только одна секция в файле), при этом для секции нужно понимать её "тип" и "имя". Посмотри по внимательнее на проект pldoc . Там есть поддержка комментариев-доков по мотивам жабских. Вот такие комменты можно использовать для указания секций, каждая секция начинается с коммента и действует до следующего или конца файла. Примерно так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. Нужно разбирать текст, после коммента-дока всё, что идёт за ним до след. дока или конца файла, считать содержимым секции, т.е. это могут быть sql-оператор и не один, комментарии и пр., нужно отбрасывать концевые пустые строки (в общем, подумать над форматированием кода с сохранением комментариев в нём). Тогда есть возможность понимать тип и имя секции, задать правила для их связей, контролировать имена секций (скажем, находить те, которые не вписываются в картину по именам), указывать опции и прочие аннотации для сборок, и т.д. И есть возможность как-то жонглировать этими секциями, м.б. и можно как-то решать задачи для сборки БД, ну и для всякого реформата исходников. А вот для "alter" БД утилита вряд ли чем поможет, а точнее вряд ли даст мощную основу для каких-то целеуказаний внешним инструментам. Пусть, например, используется сторонний крутой софт, который очень умный и ему только подавай XML-команды для правки БД, туда столбец добавить, там удалить, а тут он сам понял, что процедура обновилась (при этом он сам разруливает все связи, убирает зависимости, восстанавливает "инвалидные" объекты и пр.). Но, выдрать для него как-то данные, скажем, через ключи запуска утилиты типа "выдать alter для такой-то таблицы, где добавлены такие-то столбцы и пр.", фиг получится. Утилита ничего не знает о том, что находится внутри секции, там вообще мусор может быть (который повылазит потом при выполнении кода). Отсюда и контроль кода с анализом весьма посредственный. Теоретически, можно попробовать ввести "подсекции", к примеру, внутри "create table" выделять каждое поле или что-то в этом роде, но тут можно скатиться до "Comment SQL" в дополнение к PLSQL/TSQL/SQL plus и пр. (т.е. рядом с объявлением столбца можно написать комментарий с его описанием, что часто и делается, но для задач утилиты в этом комментарии нужно продублировать его имя, тип и пр.). Но не исключено, и думаю, что опять же через вырезы секций что-то можно подавать на вход каким-то инструментам, кроме миграций и каким нибудь тестилкам вида DbUnit, или готовить скрипты для запуска на SQL-сервере и т.д. и т.п., т.е. вполне какой-то реальный потенциал, но не сильный, как-то так. В общем, посмотри на pldoc, я с ним не работал и не разбирался, но, скорее всего, там есть почва для разбора текста. Думаю, это то, что нужно твоей утилите. Плюс заодно и какую-то HTML-документацию можно подогнать. Максим ННа счет альтеров это больной для меня вопрос, но не менее важный. Было бы здорво иметь базовый скрипт и организованный набор алтеров, а потом получить общий скрипт создания таблицы (я не говорю о чистом create, хотя бы просто сумму файлов). Т.е. я набираю в консоле утилиту и имя объекта, а получаю в нужном месте файлик с определенным именем и версией для записи в него модифицирующих операторов. А потом говорю: "собери мне скрипты создания/модификации этой таблицы с момента создания по конец прошлого года" и он покажет. Я сейчас думаю над чем-то подобным. По мотивам проекта sqlmake, я предполагаю вести ту часть sql-кода, которая "datamodel" (т.е. таблицы с индексами и пр.) в своём исходном историческом контексте, т.е. сначала базовый "create", затем все последующие "alter" и "drop", перемешанные с остальными операциями для накатов версий, иными словами писать так, как нужно последовательно развивать структуру БД, без лишней писанины. А утилита затем может собирать некую карточку или паспорт объекта (таблицы, в основном), где в одном файле (в спецкаталогах) будут собраны все исторические операторы над таблицей (create + alter-ы), собраны все связанные подтабличные объекты (индексы, ключи), будет список всех (или основных) зависимостей и т.п., причём в виде sql-кода (с учётом препроцессора, а точнее показаны и все директивы с аннотациями). Т.е. это код не для прямого исполнения, а справочная информация. Нечто подобное делают ряд IDE, где можно где-то открыть объект и IDE из БД соберёт всю доступную DDL-информацию, как по самому объекту, так и по основным связанным. Vladimir BaskakovНу когда неделю, месяц, квартал поэксплуатируете - отпишитесь. Как прошло внедрение. Это база. А клиент то к ней на чем? Как взаимодействуют структура базы, хранимки, слой бизнес-логики, слой презентации, слой нормативно-справочной информации? Как увязано с управлением требованиями к софту? Есть ли юнит-тестирование или аналоги? Что есть критерий того что ==база собралась==? ТЕ интересно применение в широком контексте. пока как то видится, что инструмент покрывает узкую зону которую и покрывать автоматизацией не так уж обязательно - опубликовали регламент на стандарт разработки, выложили типовые шаблоны.... и применить административный ресурс. И все. Копипаст файлов - папок + сниппеты = счастье. Маленькое, а большого и данная утилита не подарит? вроде. А вот в рамках широкого контекста применения рекомендую глянуть на проект TSQLMacro (там ещё есть подпроект TSQLAssert) - это ещё один велопрепроцессор, под MSSQL. Собственно, важен не сам этот проект, а он стал основой для ещё одного - Macro T-SQL ( форум ) - это ещё одно макрорасширение для TSQL, фактически, особый диалект. Обращаю внимание, что все проекты реализованы на самом TSQL, народ даже так выкручивается. Так вот, в Macro T-SQL есть уже модификация или расширение синтаксиса языка, решение неоднозначное (хотя кое-что м.б. и полезно, включая и ряд трюков для непосредственной макроподстановки элементов кода). Но основное, на что обращаю внимание, там есть попытка организации логических схем данных по модулям, попытка реализации ОПП-разработки (или абстрактных типов данных плюс интерфейсы), и пр. Можно попробовать концептуально организовать некую подобную абстракцию над БД, как некая модель данных, с модулями и ООП-мотивами. И м.б. даже есть почва для чего-то универсального под разные СУБД, например, там где нет явных структурных типов, с наследованием и пр., можно реализовать абстракции непосредственно над таблицами (как ООП-объект) плюс хранимки/функции как методы. Вот ещё одно поле для жонглирования "секциями". Только не хотелось бы получить вместо программирования на реальном коде, фактически, потребность вручную лепить AST-дерево кода в виде километровой XML-лапши. Вот у майкрософт есть свой "M Language", DSL для моделирования данных, здесь можно глянуть. Нечто подобное можно сделать под жабу. Если язык моделирования будет стандартным, то с ним начнут работать и инструменты вокруг СУБД, и джава-фреймворки вокруг интерфейсов, бизнес-логики, и прочих серверов приложений. И будет, наконец, счастье. А дальше моделирование вокруг данных нужно расширять до полноценного системного моделирования, где описывается вся система, все элементы и взаимосвязи с инвариантами, и т.д. Обязательно нужно подкрепить верификацией моделей, пусть методом "model checking", нужен какой-нибудь стандартный Coq или PROMELA . И т.д. Со временем, Java EE изменится до неузнаваемости. Собственно, прошу выше сказанное воспринять не как иронию вокруг какой-то утилиты. Я опять о том, что современный ынтырпрайз убог и калека, приходится таскаться с промышленными костылями и подпирать их сплошными велосипедами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2013, 18:37:37 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
PSV100Здесь имеются грабли, из-за которых нужно "стучать по шапке" согласно настроенной конфигурации проекта, а утилита этого никак не поймёт: - "primary key" находится не в секции "constraints"; - "create index" не расположен в секции "index ddl" и вообще ни в какой секции. Иными словами, без понимания того, что именно находится внутри sql-файла, ни о каком реальном анализе и контроле кода речи быть не может. Далее, утилита не понимает связи между секциями, т.е. если в файле будут ещё таблицы, то понять где какие "constraint"-ы и прочие всякие индексы, т.е. что к чему и к какой таблице принадлежит, не возможно. Фактически, кроме управления списком файлом, внутри самого файла утилита может лишь вырезать все "таблицы", все "индексы" и т.д. PSV100В общем, посмотри на pldoc, я с ним не работал и не разбирался, но, скорее всего, там есть почва для разбора текста. Думаю, это то, что нужно твоей утилите. Плюс заодно и какую-то HTML-документацию можно подогнать. Согласен, мутно получается. Да и комментарии тоже не выход (хотя лучше конечно). Нашел тулзовину - https://github.com/akiban/sql-parser Неплохо парсит sql-ники (по крайней мере на первый взгляд). Попробую заюзать ее, тогда можно будет полностью отказаться от Start(Stop)Text (но я их оставлю на особые случаи, как алтернативу) и лихо хранить код таблиц в одном файле и доставать нужные элементы по типу (например все индексы из модуля такого то). Ну а комменты и описания останутся для сложных, определенных пользоватлем объектов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2013, 23:58:33 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
Максим Н, Я тебе привел скрипт. Сможешь с ним работать? Нет! Значит разработчики с опытом от 3х лет с тобой работать не будут. У них иде есть. Кто твои пользователи? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2013, 10:51:28 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
Petro123Максим Н, Я тебе привел скрипт. Сможешь с ним работать? Нет! Значит разработчики с опытом от 3х лет с тобой работать не будут. У них иде есть. Я вроде ответил как можно работать с этим скриптом - http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1019474&msg=14335628 Petro123Максим Н, Кто твои пользователи? Пока только я. Мне понадобился подобный инструмент, ничего похожего готового я не нашел, вот и делаю его для себя время от времени. У меня и мыслей нет сказать: "Друзья, до этого времени вы все работали неправильно!". Просто интересно поделиться своей идеей, услышать отзывы (кстати я думал, что негатива будет гораздо больше)) ). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2013, 18:00:42 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
Максим Н, я просто отвечал на твой вопрос. Тут твой вопрос просто потёрли вместе со флеймом. У меня в скрипте больше объектов: - PK, FK, Cascade, DEFAULT, CHECK, ALTER КАЖДОГО ИЗ НИХ, CREATE каждого, DELETE каждого. - всё это перемешано в _реальном скрипте_ в очередности и синтаксически чтобы не сломать данные заказчика. Т.е. ты с таким скриптом ПОКА работать не сможешь. IMHO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2013, 20:56:53 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
Petro123Максим Н, я просто отвечал на твой вопрос. Тут твой вопрос просто потёрли вместе со флеймом. У меня в скрипте больше объектов: - PK, FK, Cascade, DEFAULT, CHECK, ALTER КАЖДОГО ИЗ НИХ, CREATE каждого, DELETE каждого. - всё это перемешано в _реальном скрипте_ в очередности и синтаксически чтобы не сломать данные заказчика. Т.е. ты с таким скриптом ПОКА работать не сможешь. IMHO Использование данной тулзы подразумевает определенный подход к разработке. Т.е. смысл не работать с одним (или несколькими) скриптом, где указана вся история создания измения базы в хронологической последовательности, а хранить данные так, чтобы на их основе можно было легко и быстро собирать разные скрипты, и что бы вести контроль, чтобы сборка была верной. Чтобы организовать все это "хозяйство" и управлять им. Т.к. при разработке БД, помимо скриптов накатки со свежими правками и альтерами новой версии у заказчика , могут понадобится (и очень часто, постоянно на этапе разработки и тестирования) некие промежуточные версии, полуверсии, комбинированные версии, версии отдельных модулей, отдельных объектов, их элементов, и куча еще всего, о чем тут много говорилось уже. Допустим разработчик выполнял какое-либо задание и внес изменения в 10 PLSQL-пакетов, после этого он набирает в консоле одну команду и получает на выходе (или уже в нужном месте, файле, папке и т.д.) скрипт для обновления, оформленный по всем внутренним корпративным стандартам (подготовителье действия, промежуточные операторы, последовательность, завершение) и ни о чем не переживает. Непренужденно накатывает его на тестовые базы, тестит, если все ок, то бросает его дальше - "в набор". На счет альтеров вопрос очень интересный, было бы здорво хранить именно с привязкой к объекту ими изменяемум, а не просто набор всех альтеров одной правки, сваленный в один файл или блок. Миграторы крутые штуки, но насколько я понимаю им все равно как и где скрипты-изменения будут хранится, как логически их объекдинить с теме объектами которые они правят. Но тут возможно я не прав, сейчас разбираюсь с этим. Я в курсе, что у многих контор (которые занимаются разработкой БД именно таким или похожими способами) есть свои специальные сборщики, скрипты, прочие тулзы, но вот чего то открытого, доступного и универсального я не нашел (возможно плохо искал...). Подъитоживая: да, к такому скрипту я ПОКА, не готов. Если будут предложения и мысли с удовольствием выслушаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2013, 21:51:17 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
Petro123, С другой стороны, если вас все устраивает в ваших скриптах, способе его формирования и прочих эксплуатационных вопросах, то эта тулза добавит только лишней работы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2013, 22:07:17 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
Максим НИспользование данной тулзы подразумевает определенный подход к разработке. Т.е. смысл не работать с одним (или несколькими) скриптом, где указана вся история создания измения базы в хронологической последовательности, а хранить данные так, чтобы на их основе можно было легко и быстро собирать разные скрипты, и что бы вести контроль, чтобы сборка была верной. Чтобы организовать все это "хозяйство" и управлять им. ==== что делать с последовательностью версий и UPDATE с 1.1 на 1.2 у заказчика? Т.к. при разработке БД, помимо скриптов накатки со свежими правками и альтерами новой версии у заказчика , ==== я так понимаю, это как раз главное и основное. А потом можно уже дополнительно КОНСТРУКТОР-СМЕШИВАТЕЛЬ версий. Допустим разработчик выполнял какое-либо задание и внес изменения в 10 PLSQL-пакетов, ===== что такое 10 PLSQL-пакеты? Это мои готовые скрипты UPDATE или CREATE с объектами в куче кода?? после этого он набирает в консоле одну команду и получает на выходе (или уже в нужном месте, файле, папке и т.д.) скрипт для обновления, оформленный по всем внутренним корпративным стандартам (подготовителье действия, промежуточные операторы, последовательность, завершение) и ни о чем не переживает. Непренужденно накатывает его на тестовые базы, тестит, если все ок, то бросает его дальше - "в набор". На счет альтеров вопрос очень интересный, было бы здорво хранить именно с привязкой к объекту ими изменяемум, а не просто набор всех альтеров одной правки, сваленный в один файл или блок. Миграторы крутые штуки, но насколько я понимаю им все равно как и где скрипты-изменения будут хранится, как логически их объекдинить с теме объектами которые они правят. Но тут возможно я не прав, сейчас разбираюсь с этим. Я в курсе, что у многих контор (которые занимаются разработкой БД именно таким или похожими способами) есть свои специальные сборщики, скрипты, прочие тулзы, но вот чего то открытого, доступного и универсального я не нашел (возможно плохо искал...). Подъитоживая: да, к такому скрипту я ПОКА, не готов. Если будут предложения и мысли с удовольствием выслушаю. 1. Что делать в Java если маппинг там статичный и варианты твоих БД не нужен? 2. Давай ещё раз по ВИ или прецендентам: - я создал скрипт выше версии 1.2 СУБД - что с ним делать дальше? Я так и не понял. Код: java 1. что получим? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2013, 23:23:12 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
Ребят, у меня ощущение, что 80% функционала покроет liquidbase, если в вашем проекте ведется нормальная версионность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2013, 10:04:39 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
ОзверинРебят, у меня ощущение, что 80% функционала покроет liquidbase, если в вашем проекте ведется нормальная версионность. дак они не знают альтернатив. И не изучают их. Если бы было - коротко - недостатки такие то.....За основу берём такой-то продукт, но допиливаем его... Другое дело.... ЗЫ. В живом проекте 50 процентов CREATE а потом идёт UPDATE с сохранением данных заказчика. Плюс строгая очерёдность версий. Тут основной упор на _конструктор_ модификаций БД. Хошь с FK, хошь без PK.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2013, 10:12:14 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
ОзверинРебят, у меня ощущение, что 80% функционала покроет liquidbase, если в вашем проекте ведется нормальная версионность. http://www.ibm.com/developerworks/ru/library/j-ap08058/ Небольшая статья, хоть и старая, но представление о продукте дает. Все create, update, alter, миграция и тд - настраивается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2013, 10:25:06 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
авторМне понадобился подобный инструмент ну а если оценивать - вот Вы потратили на него X чел-часов, и на горизонте года ждете, что от прироста эффективности прибыль будет Y. Ну и например он так понравится другим, что с его продаж еще Z? Какая отдача? Планируется.... какова сложность проекта, который тулза обслуживает?? сколько таблиц-полей в базе, сколько отличающихся веток проекта, сколько версий в каждой ветке? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2013, 10:46:54 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
Vladimir BaskakovавторМне понадобился подобный инструмент ну а если оценивать - вот Вы потратили на него X чел-часов, и на горизонте года ждете, что от прироста эффективности прибыль будет Y. Ну и например он так понравится другим, что с его продаж еще Z? Какая отдача? Планируется.... какова сложность проекта, который тулза обслуживает?? сколько таблиц-полей в базе, сколько отличающихся веток проекта, сколько версий в каждой ветке? Я пока ничего такого не планирую, это больше j4f, пишу в основном по утрам, чтобы проснуться, ну а параллельно общаюсь на эту тему с умными людьми на этом форуме (кстати, много нового узнал). Если в итоге я узнаю, что для удовлетворения своих здесь описанных разработчиских потребностей достаточно использовать инструмент X + утилиту Y и Z, и все это лихо интегрируется в текстовые редакторы и иде-шки A,B,C и D, то буду очень это рад, и буду с радостью юзать эти инструменты. Но пока такого я не нашел, и как решить мою проблему организации и сборки кода (которая у меня есть, и уже давно) - тоже, вот и делаю свой новенький двухколесный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2013, 13:01:32 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
ОзверинРебят, у меня ощущение, что 80% функционала покроет liquidbase, если в вашем проекте ведется нормальная версионность. Согласен, но остальные 20% (а может чуть больше) останутся. Я не пытаюсь повторить функционал миграторов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2013, 13:07:21 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
- ну тогда я всячески желаю расслабиться и получить максимум удовольствия от процесса. Раз уж ради фанатства. Индейцам безразличны проблемы шерифов, Пи-Эмам все равно на разработчиков, уже много разработок были выполнены и заактированы без настоящего инструмента.... Я полагаю что оставшиеся 20% потребностей не такие насущные... Они часть 80%-ого куска из правила Парето. Не генерящего существенных полезностей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2013, 18:11:49 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
ОзверинРебят, у меня ощущение, что 80% функционала покроет liquidbase, если в вашем проекте ведется нормальная версионность. Максим НСогласен, но остальные 20% (а может чуть больше) останутся. Я не пытаюсь повторить функционал миграторов. Поддержу тезис. Всё-таки, миграторы - это непосредственные исполнители операции внесения изменений в структуру БД (ну и др. связанные функции: создание с нуля, сравнение версий, поиск изменений, которые сделаны без мигратора, и т.д.). Им нужно чётко и однозначно дать целеуказания, вида добавить столбец, удалить таблицу, обновить процедуру и т.д. (о чём-то они сами догадаются). Но когда имеется потребность по-разному задавать эти действия, скажем, где-то таблицу и связанные процедуры и прочие объекты (или их варианты) создавать/обновлять в зависимости от потребностей или конфигурации конкретной БД, то, как правило, требуются дополнительные телодвижения. В каких-то случаях проще иметь несколько вариантов конфигураций для мигратора, где-то проще иметь своё метаописание для проекта (или какое-то своё его понимание), и на его основе уже формировать действия для каждого конкретного случая. Некоторые миграторы имеют в загашнике пару выкрутасов для инвариантности. Я не помню на счёт именно liquidbase, например, есть ли у него какие-то свои XML-тэги для условного выполнения (какого-нибудь if-else и т.п.), но не всегда удобен такой подход, как бы, от конкретной операции. В моём случае есть потребность в разделении функционала на логические модули, взаимосвязанные, для чего используются соответствующие стандарты в разработке и инструменты, и, прежде всего, все операции по обновлению (и создания) БД строятся в разрезе модулей, что предопределяет список конкретных действий в каждом индивидуальном случае. Поэтому мне проще иметь свои DSL и всякие стандарты по построению БД, на базе которых я могу формировать входные данные для того же liquidbase (но у нас используется свои миграторы/инсталяторы, в большинстве случаев, по ряду причин). Автор этой темы форума пытается сделать инструмент для подобного целеуказания, который будет основываться на исходном sql-коде. Собственно, на счёт миграторов это только часть функционала планируемой утилиты. Якобы закладывается возможность получать sql-скрипты под определенные потребности, и самые широкие. Скажем, дать возможность из всей кучи исходников вытащить только те sql-операторы, нужные для создания таких-то табличек и таких-то процедур с триггерами, чтобы сделать новую базку для каких-то экспериментов или разборов полётов или т.п., или удалить часть исходников по такому-то правилу, и т.д. Тут другой вопрос, насколько реально востребована (или точнее, оправдана) автоматизация подобных универсальностей. Такие вещи вынуждены делать ручками (как часто - тут у каждого своё). И есть ли реальный потенциал для подобной автоматизации, иными словами, не будет ли нагибать "шаблонизирование" и главное - поддержка этого шаблоно-конфигурирования. Поэтому, если вдруг будет инструмент лёгок в использовании, особо кушать не просит, при этом кроме миграций/создания ещё помогать и для другой рутины, пусть и не всегда заморочной, то почему бы и не использовать его. А если вдруг такая разработка станет основой уже для реальной IDE-DB, т.е. с форматированием кода и реформатом исходников, полноценный контроль и анализ кода, рефакторинг (причём как в исходниках, так и на уровне БД), контекстный автокомплит и пр. мечты, то тут уж лучше не закапывать такой потенциал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2013, 19:06:26 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
Максим НСогласен, мутно получается. Да и комментарии тоже не выход (хотя лучше конечно). Нашел тулзовину - https://github.com/akiban/sql-parser Неплохо парсит sql-ники (по крайней мере на первый взгляд). Попробую заюзать ее, тогда можно будет полностью отказаться от Start(Stop)Text (но я их оставлю на особые случаи, как алтернативу) и лихо хранить код таблиц в одном файле и доставать нужные элементы по типу (например все индексы из модуля такого то). Ну а комменты и описания останутся для сложных, определенных пользоватлем объектов. Максим, имхо, правильно то, что начал смотреть в сторону sql-парсинга, без него никак. По своему опыту. У нас когда-то были похожие мысли и попытки организовать подобную разработку, где на куче create-исходников (в основном, разделенных до уровня файл -> объект БД) пытались ими вертеть во все нужные стороны. Решали основные задачи - create и alter БД, какой-то контроль и всякий реформат специально не рассматривались. Были проблемы: - геморно организовать полную автоматизацию накатов изменений только на основе create-операторов. Для этого нужно иметь ограничения, например, таблицы должны создаваться только через явные "create table", добавляемые столбцы должны иметь default-значение и пр. (хотя, это может и лучше для проектов, всё равно какие-то ограничения и стандарты или договоренности всегда имеются). Для автоматического сравнения структур БД, как самих БД, так и исходников (или сравнение скрипта и БД), в принципе, имеется стандартный или придворный функционал в тулсах при СУБД. Но задача усложняется при вариантности (о которой уже не раз жужжали), к тому же для миграций/создания имеется потребность в выполнении блоков кода, для всяких дополнительных вычислений. Соответственно, всё нужно состыковывать; - даже если и организовать полную автоматизацию (скажем, выстроить правильную цепочку alter-ов, с разруливанием всех зависимостей и решения вопросов на счёт "инвалидности", плюс правильно подмешивая свои вычисления), то её применение тоже геморно. Очень легко получить неприемлемое время для накатов, когда тулсы будут долго шевелиться, перелопачивая кучу исходников и немалую БД, а то и не одну. К тому же сложно организовать этот процесс, хоть и вполне возможно, но там где сложно, там больше глюков. Короче говоря, для обновления "datamodel" (т.е. таблиц с индексами и отношениями и пр.) лучше и проще оперировать явными операциями alter и т.д., пусть лучше для этого помогают умные IDE и пр., есть возможность всё перепроверить и оценить и пр., одним словом, это гораздо надёжнее. К тому же подготавливаются действия для многоразового применения, и нет потребности их постоянно высчитывать (условно, если говорить об "инвариантности"). Поэтому от явной ручной истории изменений БД отказаться не получилось, соответственно, уменьшить писанину таким образом не удалось. Потом на глаза попалось решение поверх препроцессора, что дало возможность работать с sql-исходниками как и с другими C/C++/Java/Delphi/и пр. проектами, с гибкостью для организации вариантов сборки и пр. плюшки. Свой велик на основе жонглирования исходников был недоделанным заброшен. А хочу я сказать следующее. Если вертеть исходниками и так и этак, то хотя бы придётся решать всякие скользкие нюансы. Ну, например, чтобы произвольно слепить sql-скрипт, вырезая откуда-то данные, нужно в итоге или правильно эти данные вырезать, или правильно сформировать, а то и то и другое вместе. Пусть подготавливается текст хранимой процедуры, нужно полностью понять весь тот исходный текст, который к ней относится, т.е. зная, что sql-операторы разделяются, например, через ";", но внутри процедуры имеются свои операторы с ";", то нужно понимать или действующий терминатор операций, заданный для текущей позиции в скрипте, или самому надёжно определять, где находится последний "end" для процедуры. А в итоговый скрипт (или нужное место в скрипте) нужно правильно внести данные, вставив правильно "/", "go", "set term", "commit work" и т.п. Короче говоря, всплывут потребности, о которых раньше мог и не подумать. На счёт этого Akiban sql-parser. Я на него быстро глянул левым глазом да по диагонали. Я не в курсе его архитектуры, но есть подозрение, что у него основной упор делается на построение AST-дерева кода. И, например, если ты ему на вход подашь "в лоб" многокилометровый дамп БД, и он "в лоб" будет строить супер-глобальное AST (если сможет хотя бы разделять операторы), то на этом работа утилиты и будет закончена, с позором. Поэтому не исключено, что потребуется свой предпроцессинг исходников, и этому sql-парсеру скармливать отдельные sql-операторы, если уж нужно именно AST. Я как-то здесь давал рекомендации по поводу разбора текста. Ниже (см. прикрепление) я выложу пример такого парсера. Это лишь кусок (по потребности могу выложить всё) от древнего давно умершего опенсорс-проекта, сделанного в 90-х на Delphi для печати отчётов. В своё время именно этот проект начал вправлять мозги, как можно решать проблемы (к примеру, в ту эпоху какое-то программное решение для печати отчётов, фактически, было дикостью, когда везде вокруг сплошные GUI-дизайнеры отчётов, ну и форм интерфейса). В архиве несколько файлов (первичный - SRTokenizer), чтобы понять что к чему, какая там архитектура и принципы использования парсера и т.д. (если с Паскалем/Delphi дел не имел, то всё равно понять элементарно), плюс исходный Help-файл (другой документации толком и не было) и примеры, чтобы понять, для DSL какого вида (местами похож на SQL) вся кухня затевалась. Я планирую свою тулсу, для миграций и созданий, с препроцессором и прочими блэкджэком и шлюхами. Не исключено, что будет использоваться подобный парсер. Готовой реализации на java я не встречал, но специально не искал. Но, во-первых, я не знаю, когда дело дойдёт до реальной разработки, во-вторых - я ещё окончательно не знаю, в каком виде будет реализован разбор текста. Особенности предложенного варианта: - реализуется именно потоковый разбор (естественно, из разных источников - строка, файл и любой абстрактный поток данных), причём нет заранее предопределенной грамматики, или заданных лексем или списка ключевых слов и т.п.; - парсер динамически настраивается под конкретные нужды, т.е. программно задаётся массив правил для токенов, что предопределяет логику разбора. В отличие от типовых генераторов парсеров на основе BNF/PEG-грамматик здесь имеется возможность для гибкого ручного, т.е. самостоятельного, разбора текста. А также есть потенциал для динамической настройки, т.е. не только в compile-time или на этапе генерации java-исходников. Но, для задач с очень большой сложностью разбора заранее сформированные строго формальные грамматики могут оказаться более полезными, или как раз через грамматики и упрощается жизнь, всё контролируемо и не допускается ручного произвола. К тому же через предопределенные грамматики больше потенциал для оптимизаций кода, можно добиться меньше операций сравнения текстовых строк и т.д. Здесь нужно всегда (как и везде) анализировать конкретные потребности и возможности. Поэтому не исключено, что правильно взять JavaCC и т.п., или посмотреть в сторону Scala (там вроде есть придворный PEG-парсер, к тому же развиваются макросы для compile-time). В общем, посмотри, вдруг что и пригодится: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2013, 19:46:51 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
PSV100, За полезную ссыль спасибо, посмотрю. Насчет Акибана это я погорячился, весчь крутая, но совершенно для других целей. Может хватит простых регулярок... Добавил поле "mask" в xml'ину, например так: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Понятно, что сейчас там нет проверки на комментарии и возможно множество других нюансов, но зато прозрачно и просто. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2013, 20:54:19 |
|
||
|
Выбор СУБД для небольшой Java-утилиты
|
|||
|---|---|---|---|
|
#18+
Максим НМожет хватит простых регулярок... Добавил поле "mask" в xml'ину, например так: [...] Понятно, что сейчас там нет проверки на комментарии и возможно множество других нюансов, но зато прозрачно и просто. Ну, не знаю, если связываться с регулярками, то процесс написания конфигураций для проекта будет похож на написание какого-то sql-mode для эмакса, не всех подобное привлекает. Кстати, напоминаю, что в тех же текстовых редакторах можно подсмотреть написание меток кода. Вим/эмакс в большинстве случаев оперирует ctags или подобным, Sublime имеет метки из коробки, к тому же у него есть ещё понятие "scope" кода (кстати, полезное свойство), есть ещё под винду такой HippoEDIT - неплохой блокнот в стиле а-ля вижуал-студия, там тоже свои метки кода. В JEdit кроме регулярок имеются и дополнительные правила, а точнее альтернатива для сплошных регэкспов (для производительности и простоты), например, можно указать, что литерал должен начинаться с первых значимых символов в строке и с таких-то слов, литерал не разбивается на строки и т.д. Более того, для JEdit есть плагины вокруг SQL-СУБД, например, DBTerminal (но это вроде простой "терминал"), SQL (продвинутый плагин), PelczarSql (на него больше обращаю внимание, там вроде нет документации, но и так всё понятно, если установить). Эти плагины пытаются дублировать функционал типовых DB-плагинов в IDE, при этом имеется шаблонная система для организации SQL-запросов к серверу с целью составления дерева объектов БД, просмотра структуры объекта и т.д. Что как раз в тему для твоей утилиты, и похожие принципы. Собственно, можно в том же JEdit подсмотреть и парсеры для разбора текста. А если пойти дальше, то у него есть своя подсистема "SideKick" - некий аналог Эклипса для организации уже семантического разбора текста, плюс куча плагинов вокруг этого. Короче говоря, можно сделать себе свой Эклипс для своих конкретных нужд, которым на порядок удобнее пользоваться, чем тем же эклипсом, нетбинсом, Идеей и пр. (JEdit местами удобнее вима/эмакса/Sublime, но у него есть и свои особенности). Или, поскольку JEdit это не ынтерпрайзно, то можно посмотреть на тот же Эклипс. Там есть костяк для реализации парсеров, всё сразу будет интегрировано в IDE, доступен дополнительный огромный функционал, типа форматирование кода, управление проектом, есть и свои DB-плагины и т.д. Тогда это будет вполне ынтырпрайзно, вызывать меньше вопросов, и больше соответствовать названию проекта - LiWIDE (т.е. именно IDE). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2013, 01:47:00 |
|
||
|
|

start [/forum/topic.php?fid=59&startmsg=38270863&tid=2129029]: |
0ms |
get settings: |
15ms |
get forum list: |
26ms |
check forum access: |
8ms |
check topic access: |
8ms |
track hit: |
42ms |
get topic data: |
21ms |
get forum data: |
5ms |
get page messages: |
98ms |
get tp. blocked users: |
2ms |
| others: | 287ms |
| total: | 512ms |

| 0 / 0 |
