SQL query diff

12
DV
На сайте с 01.05.2010
Offline
644
#11

Читайте условия.

Мне не нужны системы управления версиями, я ими и так пользуюсь, в том числе, самописной.

Мне не нужны системы деплоя, я их и так использую.

У меня есть задача работы с проектом, который очень давно не я начал, и не я его буду заканчивать. С установившейся системой патчей.

wdiff на данный момент устраивает.

meld даёт красивый удобный GUI, но годится не во всех случаях.

VDS хостинг ( http://clck.ru/0u97l ) Нет нерешаемых задач ( https://searchengines.guru/ru/forum/806725 ) | Перенос сайтов на Drupal 7 с любых CMS. ( https://searchengines.guru/ru/forum/531842/page6#comment_10504844 )
SeVlad
На сайте с 03.11.2008
Offline
1609
#12

есть ещё kdiff3 если для линя. (у меня в крусайдере он используется)

Для винды в тоталкоммандере есть сравнивалка нормальная.

Делаю хорошие сайты хорошим людям. Предпочтение коммерческим направлениям. Связь со мной через http://wp.me/P3YHjQ-3.
PA
На сайте с 12.02.2016
Offline
24
#13
DenisVS:
Всё-таки meld часто лажает. Не синхронизируется, выдаёт кашу.
wdiff намного точнее, чётко указывает, что изменилось, и даже пробелы/табуляция с толку не сбивают.

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

а чем можно просматривать вывод wdiff? желательно из готового, хотя самому набросать пару регулярок тоже не проблема. :)

наткнулся еще на diffuse (есть на epel) - вроде симпатичная вещь, попробую погонять его как альтернативу meld. кстати, в нем можно сравнивать и три файла одновременно, эх... монитор бы мне пошире 😂

. . .
DV
На сайте с 01.05.2010
Offline
644
#14
ps axf:
а чем можно просматривать вывод wdiff?

Не совсем понял.

Сделать вывод наглядным? Он сам делает подсветкой.

Я обычно пользуюсь опцией -3 для вывода только различий, и -t для подсветки.

Где прибыло, подчёркнуто. Где убыло, подсвечено.

Можно копировать выделением мышкой прямо в консоли и вставлять в код (но тут форматирование несколько ломается — пробелы и табуляции GUI и CLI передают через буфер по-разному, либо в CLI нет табуляции, я не знаю, не заморачивался).

DV
На сайте с 01.05.2010
Offline
644
#15

Возможно, кому-то будет интересно решение задачи сравнения структур живых баз.

Всё это нужно с целью миграции между версиями движков.

Провёл небольшое исследование, выбрал то, что рабочее и может пригодиться (пригодилось).

Web-based

1. https://github.com/muatik/mysqlDiff

В index.php назначаем root доступ, на выходе цветное.

2. https://github.com/dilana/mysqldiff

Отличная вещь!

Нормальный интерфейс, diff в таблице.

3. https://github.com/thejwalker/mysql_diff

Отличная вещь!

В конфиге прописываем 2 базы,

На выходе красочный список изменений.

4. https://github.com/chriscurran/db_diff

В конфиге прописываем 2 базы,

На выходе красочный список изменений с разворачивающимися таблицами.

SQL

Выполнить запрос в консоли, подставив названия баз вначале.

SET @firstDatabaseName = '[first database name]';

SET @secondDatabaseName = '[second database name]';

SELECT * FROM
(SELECT
CONCAT(cl.TABLE_NAME, ' [', cl.COLUMN_NAME, ', ', cl.COLUMN_TYPE, ']') tableRowType
FROM information_schema.columns cl, information_schema.TABLES ss
WHERE
cl.TABLE_NAME = ss.TABLE_NAME AND
cl.TABLE_SCHEMA = @firstDatabaseName AND
ss.TABLE_TYPE IN('BASE TABLE', 'VIEW')
ORDER BY
cl.table_name ) AS t1
LEFT JOIN
(SELECT
CONCAT(cl.TABLE_NAME, ' [', cl.COLUMN_NAME, ', ', cl.COLUMN_TYPE, ']') tableRowType
FROM information_schema.columns cl, information_schema.TABLES ss
WHERE
cl.TABLE_NAME = ss.TABLE_NAME AND
cl.TABLE_SCHEMA = @secondDatabaseName AND
ss.TABLE_TYPE IN('BASE TABLE', 'VIEW')
ORDER BY
cl.table_name ) AS t2 ON t1.tableRowType = t2.tableRowType
WHERE
t2.tableRowType IS NULL
UNION
SELECT * FROM
(SELECT
CONCAT(cl.TABLE_NAME, ' [', cl.COLUMN_NAME, ', ', cl.COLUMN_TYPE, ']') tableRowType
FROM information_schema.columns cl, information_schema.TABLES ss
WHERE
cl.TABLE_NAME = ss.TABLE_NAME AND
cl.TABLE_SCHEMA = @firstDatabaseName AND
ss.TABLE_TYPE IN('BASE TABLE', 'VIEW')
ORDER BY
cl.table_name ) AS t1
RIGHT JOIN
(SELECT
CONCAT(cl.TABLE_NAME, ' [', cl.COLUMN_NAME, ', ', cl.COLUMN_TYPE, ']') tableRowType
FROM information_schema.columns cl, information_schema.TABLES ss
WHERE
cl.TABLE_NAME = ss.TABLE_NAME AND
cl.TABLE_SCHEMA = @secondDatabaseName AND
ss.TABLE_TYPE IN('BASE TABLE', 'VIEW')
ORDER BY
cl.table_name ) AS t2 ON t1.tableRowType = t2.tableRowType
WHERE
t1.tableRowType IS NULL;

Выведет таблицу с изменёнными столбцами

-----

Есть ещё разные средства, которые я не смог запустить в данный момент в своём окружении по тем или иным причинам, тем не менее, обещающие быть интересными. Оставил на потом.

Так, чтобы генерировало SQL запросы, производящие "патч" базы пока не нашёл, всё приходится делать вручную. Заняло довольно немного времени при миграции форума между существенно отличающимися версиями+сборками.

MySQL SHOW CREATE помогает, остальное на болванке — заводишь нужные столбцы, удаляешь ненужные, перемещаешь то, что должно быть перемещённым.

В Adminer (как и в PMA) произведённые запросы выводятся в оформленном виде.

Все они конспектируются, пишется SQL скрипт.

Далее, пишется Shell скрипт, из которого запускается вышеобозначенный, а так же, производится копирование, перемещение файлов и директорий. Из него же запускается PHP скрипт в CLI, меняющий тэги путём обработки базы.

Редактирование дампа с помощью SED признал нежизнеспособным в связи с жадными/ленивыми регекспами и сложными экранированиями. По факту, PHP отработал на удивление быстро.

Всё это дело испытывается на тестовом движке, и, в случае успеха, запускается на живом форуме/CMS.

В итоге, сложнейшая операция—миграция проводится за несколько минут, почти не нарушая аптайм. Сообщения не теряются.

Методику рекомендую.

PA
На сайте с 12.02.2016
Offline
24
#16
DenisVS:

SQL
Выполнить запрос в консоли, подставив названия баз вначале.
...
Выведет таблицу с изменёнными столбцами

сорри, что влез, но как-то у вас сильно сложный запрос. упростил до одного селекта:


SELECT GROUP_CONCAT(ss.TABLE_SCHEMA) db_name, CONCAT(cl.TABLE_NAME, ' [', cl.COLUMN_NAME, ', ', cl.COLUMN_TYPE, ']') tableRowType
FROM information_schema.TABLES ss, information_schema.columns cl
WHERE
ss.TABLE_SCHEMA IN ('my_db1', 'my_db2') AND ss.TABLE_TYPE IN('BASE TABLE', 'VIEW') AND
ss.TABLE_NAME = cl.TABLE_NAME AND ss.TABLE_SCHEMA = cl.TABLE_SCHEMA
GROUP BY tableRowType
HAVING count(*)<2
ORDER BY cl.TABLE_NAME, cl.COLUMN_NAME, db_name

'my_db1', 'my_db2' - базы, которые сравниваем, при желании можно сравнивать любое количество баз.

HAVING count(*)<2 - сравниваем две базы

ну и сортировку - по вкусу, кому как удобнее.

Upd: добавил в запрос GROUP_CONCAT() - он нужен если сравнивается больше двух баз. теперь крАсота. :)

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий