|
|
|
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
|
|||
|---|---|---|---|
|
#18+
Всем привет. Работаю с базами данных совсем недавно и столкнулся с такой задачей: Есть 2 базы данных Firebird 2.5. Нужно сравнить эти базы (структуру и данные) и выдать результат в виде файлов *.ddl и *.sql с содержанием типа: insert into TABLE1 (...) values (...). Читал про EXECUTE STATEMENT, не понял ничего. Нужно чтобы данные в одной базе данных соответствовали данным в другой базе данных. Есть какой-нибудь пример выборки данных из таблицы оной базы данных и сравнением с другой таблицей в другой базе данных? Как вообще делаются такие вещи? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 14:50:40 |
|
||
|
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
|
|||
|---|---|---|---|
|
#18+
Snake174, IBExpert это умеет делать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 14:54:21 |
|
||
|
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
|
|||
|---|---|---|---|
|
#18+
Симонов Денис, Да я знаю, что есть специальные утилиты для этого. Но мне нужно под линукс и самому это сделать ПРОГРАММНО. Мне бы какой-нибудь пример выборки из внешней базы данных. Спасибо что откликнулись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 15:03:03 |
|
||
|
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
|
|||
|---|---|---|---|
|
#18+
Snake174Читал про EXECUTE STATEMENT, не понял ничего.Где читал и как смог не увидеть примеров ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 15:04:36 |
|
||
|
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
|
|||
|---|---|---|---|
|
#18+
Hello, Snake174! You wrote on 29 января 2014 г. 15:10:40: Snake174> мне нужно под линукс и самому это сделать ПРОГРАММНО. обращайся в подфорум "работа". тебе программист нужен. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 15:11:41 |
|
||
|
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
|
|||
|---|---|---|---|
|
#18+
Snake174, это подойдёт http://firebirdsql.su/doku.php?id=execute_statement ($firebird)/doc/sql.extensions/README.execute_statement.txt ($firebird)/doc/sql.extensions/README.execute_statement2.txt ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 15:16:17 |
|
||
|
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
|
|||
|---|---|---|---|
|
#18+
Симонов Денис, Спасибо. Вот недавно на это же описание наткнулся. Сижу, разбираюсь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 15:25:30 |
|
||
|
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
|
|||
|---|---|---|---|
|
#18+
Замерли в ожидании чуда! Отлично знающие всю "кухню" люди такой инструмент месяцами выпиливают, и годы доводят до блеска, а тут щас бац! и готов программный инструмент под линукс для полной синхронизации баз по метаданным и данным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 15:39:17 |
|
||
|
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
|
|||
|---|---|---|---|
|
#18+
Блин, прозевал, какое было 10000-ным? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 15:41:07 |
|
||
|
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
|
|||
|---|---|---|---|
|
#18+
господа, а каким боком execute statement относится к сравнению баз? Не нужен он тут совершенно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 15:41:23 |
|
||
|
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
|
|||
|---|---|---|---|
|
#18+
kdvгоспода, а каким боком execute statement относится к сравнению баз? у так чтобы их сравнить, надо их как-то доставить в одно место, где и будет производиться сравнение. Традиционно таким местом является клиентское приложение, но аффтар решил пойти своим путём и делать это в ХП. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 15:50:50 |
|
||
|
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, Т.к. упоминаются такие слова как Qt4/C++, линкус, то похоже всё-таки не в ХП. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 16:34:10 |
|
||
|
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakovно аффтар решил пойти своим путём и делать это в ХП. думаю, он случайно увидел буквосочетание ES, и его на нем заклинило. Теоретически через ES и даже ES on external что-то можно сделать, но это а) трудоемко б) тормозно. Просто сделать два коннекта Snake174 почему-то не догадался. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 16:50:06 |
|
||
|
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
|
|||
|---|---|---|---|
|
#18+
Snake174Всем привет. Работаю с базами данных совсем недавно и столкнулся с такой задачей: Есть 2 базы данных Firebird 2.5. Нужно сравнить эти базы (структуру и данные) и выдать результат в виде файлов *.ddl и *.sql с содержанием типа: insert into TABLE1 (...) values (...). Читал про EXECUTE STATEMENT, не понял ничего. Нужно чтобы данные в одной базе данных соответствовали данным в другой базе данных. Есть какой-нибудь пример выборки данных из таблицы оной базы данных и сравнением с другой таблицей в другой базе данных? Как вообще делаются такие вещи? Спасибо. Как уже было сказано, если тебе надо через Qt, то и делай через Qt и execute statement тут вообще не при делах. Тоесть подключаешся к твоим базам данных, делаешь в обеих "select * from sometable" и сравниваешь получившиеся результаты. По результатам сравнения генерируешь тексты запросов. В свое время в Qt были проблемы с поддержкой FB (не помню деталей, но пришлось делать какие-то лишние телодвижения с драйвером - то ли его не было в стандартной поставке, то ли он был не сконфигурирован - не помню), как теперь - не знаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 16:56:51 |
|
||
|
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
|
|||
|---|---|---|---|
|
#18+
ну и кроме того, любые "сравниватели таблиц" работают ужасно медленно, потому что алгоритм лучше не придумать. См. ChangeManager . Собственно, автор рискует пытаться повторить функционал Change Manager (за исключением сравнения конфигураций). Для справки - лицензия на раб. место на 1 сервер стоит примерно 960 долларов. И там все весьма непросто. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 16:56:54 |
|
||
|
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
|
|||
|---|---|---|---|
|
#18+
Симонов ДенисIBExpert это умеет делать а если обернуть ibescript.dll своей оберткой, то будет "программно". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 19:36:57 |
|
||
|
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
|
|||
|---|---|---|---|
|
#18+
Ivan_PisarevskyСимонов ДенисIBExpert это умеет делать а если обернуть ibescript.dll своей оберткой, то будет "программно". Э... а что, в ibescript.dll заложен функционал dbcomparer-а? Или ты о чем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 20:16:16 |
|
||
|
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
|
|||
|---|---|---|---|
|
#18+
kdv, Я с самого начала так и сделал, но потом подумал, может быть как-нибудь с помощью SQL можно это сделать быстрее. Просто чтение и сравнение в программе происходят долго, да еще и формирование патчей одновременно происходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 21:24:25 |
|
||
|
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
|
|||
|---|---|---|---|
|
#18+
miwaonline, Использую Qt 4.7.4 с драйвером проблем нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 21:27:27 |
|
||
|
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
|
|||
|---|---|---|---|
|
#18+
Snake174Просто чтение и сравнение в программе происходят долго Значит ты их неправильно делаешь. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 21:28:57 |
|
||
|
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
|
|||
|---|---|---|---|
|
#18+
kgb ussrв ibescript.dll заложен функционал dbcomparer-а?Да. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 23:59:33 |
|
||
|
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
|
|||
|---|---|---|---|
|
#18+
Snake174 Просто чтение и сравнение в программе происходят долго скорость зависит от множества условий. Для начала надо убедиться, что вообще абстрактное чтение (прогон по записям одной таблицы) происходит максимально быстро - компоненты могут добавлять оверхед, который м.б. нельзя победить (или можно). Потом надо определиться с буферизацией одной из сравниваемых таблиц. Например, если это мелкая таблица, ее было бы неплохо закэшировать. Если большая - кэшировать нельзя, сожрет много памяти (вопрос, сколько ресурсов есть). Причем, через count определять кол-во записей нельзя, это долго, значит надо использовать трюк с обновлением статистики по индексу ПК и получением кол-ва записей как 1/selectivity. Дальше, по каким столбцам сравнивать. Наконец, сам алгоритм сравнения двух множеств. Snake174может быть как-нибудь с помощью SQL можно это сделать быстрее Ну, через Execute block + execute statement on external можно, но мне кажется, для начала надо сделать вариант без этого. Конечно, при EB+ES с одной стороны не будет буферизации на клиенте, но возможно это и плохо, и также это может работать медленнее "клиентского" варианта. Придется экспериментировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 00:38:22 |
|
||
|
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
|
|||
|---|---|---|---|
|
#18+
kdvПотом надо определиться с буферизацией одной из сравниваемых таблиц. Это ещё зачем? Обе таблицы читаются последовательно, каждая запись - ровно по одному разу. Зачем хранить то, что уже никогда не потребуется?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 00:53:04 |
|
||
|
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
|
|||
|---|---|---|---|
|
#18+
DS> Зачем хранить то, что уже никогда не потребуется?.. Потому шо гладиолус! (с) Не мешай человеку. Нехай буферизирует. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 00:57:34 |
|
||
|
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, ну, да, похоже с буферизацией я прогнал. мысль какая-то проскочила, но не оформилась. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 01:07:55 |
|
||
|
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
|
|||
|---|---|---|---|
|
#18+
Как будто про EB+ES ты всё правильно сказал. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 02:04:29 |
|
||
|
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
|
|||
|---|---|---|---|
|
#18+
Гаджимурадов Рустам, а что там я неправильно сказал? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 02:09:07 |
|
||
|
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
|
|||
|---|---|---|---|
|
#18+
Да всё, практически. Чем плодить кривую наколенку (не смотрел, что конкретно предоставляет в данном случае ibescript - напрямую результат сравнения или промежуточные данные) в абсолютном большинстве случаев лучше делать это на сервере. Контра всего 3 - не 2.5, нет доступа к БД2 из БД1 (что сомнительно) и какие-то неозвученные доп. моменты типа доп.действий на клиенте (DDL etc). P.S. Я даже больше скажу - если бы требовалось бы простое сравнение метаданных БД клиентов (сопровождение, апдейты и пр.) - я бы вообще не парился и какой-нибудь "функцией" (любой хеш) сабж проверял бы: типа не сходится - сразу в сад. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 04:57:18 |
|
||
|
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovSnake174Просто чтение и сравнение в программе происходят долго Значит ты их неправильно делаешь. Первая БД - с которой сравниваю, вторая БД должна получиться как первая. Сейчас я делаю так: 1) Получаю список имён таблиц в обеих базах. 2) Если в 1-ой БД есть какая-нибудь таблица, а во 2-ой её нет - получаю структуру этой таблицы и создаю её во 2-ой БД со всеми данными из 1-ой. Если в 1-ой БД нет таблицы, а во 2-ой есть - удаляю из 2-ой БД эту таблицу. 3) Формирую файл patch.ddl. 4) Загружаю данные из таблиц 1-ой и 2-ой БД. 5) Каждую запись 1-ой таблицы из 1-ой БД сравниваю со всеми записями из таблицы 2-ой БД. 6) Если что-то не совпадает, записываю в файл patch.sql. Тут ещё со связями таблиц некоторая заморочка. Нужно определять какая таблица с какой связана, получать ID записей и как-то объеденить это всё. Но пока вроде работает, определяет каких записей не хватает или они отсутствуют, формируются файлы, только связи с таблицами не установлены. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 06:10:12 |
|
||
|
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
|
|||
|---|---|---|---|
|
#18+
Snake1744) Загружаю данные из таблиц 1-ой и 2-ой БД. 5) Каждую запись 1-ой таблицы из 1-ой БД сравниваю со всеми записями из таблицы 2-ой БД. Не надо так делать зы. сортировка и чтение отсортированных НД с сравнением тебе помогут ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 09:31:51 |
|
||
|
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
|
|||
|---|---|---|---|
|
#18+
Snake174Тут ещё со связями таблиц некоторая заморочка. Нужно определять какая таблица с какой связана, получать ID записей и как-то объеденить это всё. И зачем тут нужны ID записей?? ps/ как по мне то в самом начале убить все ФК и в самом конце создать все ФК заново, ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 10:00:11 |
|
||
|
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
|
|||
|---|---|---|---|
|
#18+
ГР: Как будто про EB+ES ты всё правильно сказал kdv: а что там я неправильно сказал? ГР: Да всё, практически. просто прекрасно. При этом ты сам пронес ахинею, особенно про "типа не сходится - сразу в сад". Потому что он с самого начала писал про diff. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 11:51:12 |
|
||
|
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
|
|||
|---|---|---|---|
|
#18+
kdv> При этом ты сам пронес ахинею Прекрасно. Останемся при своих двух ахинеях. А читатели пусть выбирают меж двух ахиней, какая разумнее и правильнее. На клиент тащить все данные обеих БД , ага. В мемориз. kdv> особенно про "типа не сходится - сразу в сад". kdv> Потому что он с самого начала писал про diff. Там стоит постскриптум и "если". Читай внимательнее. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 14:52:53 |
|
||
|
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
|
|||
|---|---|---|---|
|
#18+
Гаджимурадов Рустам, согласись, что алгоритмически все должно быть примерно одинаково, что через клиента, что через ES. Но ES гораздо сложнее пишется. Особенно я не вижу смысла в ES при сравнении метаданных. Так что вполне можно вначале сделать обычного клиента, а потом, при желании - на ES. Мне даже интересно, существует-ли уже у кого то подобное решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 15:07:41 |
|
||
|
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
|
|||
|---|---|---|---|
|
#18+
kdv> согласись, что алгоритмически все должно быть kdv> примерно одинаково, что через клиента, что через ES Не совсем. На сервере есть ещё SQL, в т.ч. множественный, на клиенте же только построчное сравнение. kdv> Но ES гораздо сложнее пишется Я бы так не сказал. Более того, ES-скрипт пишется один раз. kdv> Особенно я не вижу смысла в ES при сравнении метаданных. Я бы сказал, что никакой разницы нет. Сосвсем никакой. kdv> Так что вполне можно вначале сделать обычного клиента, kdv> а потом, при желании - на ES. Ты всерьёз не понимаешь, что это во-первых, мартышкин труд двойная работа, а во-вторых, тащить (повторяю) все записи обех БД на клиента не лучшая идея при наличии альтернатив? kdv> Мне даже интересно, существует-ли уже у кого то подобное решение. У Хвастунова и Лободы? :) Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 15:17:40 |
|
||
|
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
|
|||
|---|---|---|---|
|
#18+
Гаджимурадов РустамНе совсем. На сервере есть ещё SQL, в т.ч. множественный, на клиенте же только построчное сравнение. for select/for execute statement тоже построчный. while not Q.Eof do Q.Next то же самое. А join из двух баз сделать нельзя. Так что в ES будут те же циклы. А значит алгоритмически решение будет мало отличаться. Ну и, на клиенте запрос для поиска идентичной записи конструировать тоже проще (я про where). Гаджимурадов РустамТы всерьёз не понимаешь, что это во-первых, мартышкин труд двойная работа, а во-вторых, тащить (повторяю) все записи обех БД на клиента не лучшая идея при наличии альтернатив? Например, я вижу функционал ChangeManager. Он вообще на Java написан. Понятно что ES он использовать не будет. Допустим, ES альтернатива, но автор-то "не разобрался". Если идеи нет, в ES тоже фигня получится. Гаджимурадов Рустамkdv> Особенно я не вижу смысла в ES при сравнении метаданных. Я бы сказал, что никакой разницы нет. Совсем никакой. есть, потому что в отличие от данных метаданные разбросаны по разным таблицам. Тупо сравнивать rdb$fields не пройдет. Впрочем, не вижу тут предмета для спора, это всего лишь варианты реализации. Например, если у автора базы небольшие, я бы с ES связываться не стал, т.к. выигрыш вряд ли будет серьезно значимым. Гаджимурадов РустамУ Хвастунова и Лободы? :) я про сравнение данных и метаданных через ES. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 15:44:53 |
|
||
|
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
|
|||
|---|---|---|---|
|
#18+
kdv> А значит алгоритмически решение будет мало отличаться Отличатеся как минимум тем, что не всё уйдёт на клиента, а только половина. Плюс всё это будет не жестко зашито в exe, а в какой-нибудь ХП. Ну и наконец об конкретном алгоритмическом решении можно рассуждать только тогда, когда будёт чёткая постановка задачи, а не как тут. > Ну и, на клиенте запрос для поиска идентичной записи > конструировать тоже проще (я про where). А в чём разница? Конкатенация строк есть и там, и там. > Например, я вижу функционал ChangeManager. > Допустим, ES альтернатива, но автор-то "не разобрался". > Если идеи нет, в ES тоже фигня получится. Вообще, забавная логика, альтернативная. Если идеи нет, то на клиенте лучше, да. > есть, потому что в отличие от данных метаданные разбросаны по разным таблицам. Тоже в мемориз. > Тупо сравнивать rdb$fields не пройдет. Ты уже пробовал? И что именно не получилось? > Впрочем, не вижу тут предмета для спора Аналогично. Аминь. > Например, если у автора базы небольшие, я бы с ES связываться > не стал, т.к. выигрыш вряд ли будет серьезно значимым. Я бы вообще ничего вручную делать не стал, ни в ES, ни тем более не клиенте. Есть IBE, есть ibeblock, ibescript и ibec_CompareMetadata, есть, наконец, готовые решения. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 15:55:26 |
|
||
|
|

start [/forum/topic.php?all=1&fid=40&tid=1563928]: |
0ms |
get settings: |
6ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
181ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 187ms |
| total: | 450ms |

| 0 / 0 |
