Как сравнить структуры двух БД и создать скрипт миграции?

Ссылка скопирована
1 ответ

Подскажите, может быть кто-то знает такой инструмент, чтобы можно было быстро сравнить структуры БД и сделать скрипт, который приводит одну БД к структуре второй? Меня в первую очередь SQLITE интересует, но готов рассмотреть любые варианты.

Дополнительно:

смутно представляю себе людей готовых запустить на большой базе скрипт непонятно кем сгенерированный. вот честно говоря сильно бы хотелось бы посмотреть на самоубийц. желательно дистанционно. а для мелких бд - смысл делать такой генератор?

  • Дмитрий, Прочитать скрипт перед запуском?
  • Илья Т., ну если у вас 10 таблиц оно может и норм. а если 2000 то задолбаетесь читать. А учитывая что выкатывание миграций на прод вообще процесс не тривиальный и какой нибудь не правильный альтер тейбл может подвесить вам здоровую таблицу на длительное время и приходится разбивать эти альтеры на несколько операций, а в терминальных случаях делать копию таблицы обвешивать триггерами и потом переименовывать и только разработчик знает чего и как в каком случае делать то получается ровно что я написал - для серьезных и больших проектов такой скрипт не применим, а для мелких проектов - чего геммороится можно руками
  • не важно сколько таблиц. важно сколько изменений.
  • Илья Т., ну количество изменений в своем максимуме будет равно количеству столбцов во всех таблицах. Учитывая что таблицы с тысячами колонок в реляционных базах в большинстве случаев вообщем то бэд практис - то опять же таки возвращаемся к тому что я сказал.
  • Докладываю: нужный функционал обнаружился в PycharmPro (вероятно есть и в других продуктах линейки Pro).
    Делает ровно то что мне нужно.

    Ответы:

    быстро сравнить структуры БД и сделать скрипт, который приводит одну БД к структуре второй?

    В этой задаче - большое количество подводных камней. Например что делать если в двух БД есть одинаковые
    поля но имеющие разный тип (NUMERIC / VARCHAR). Дилемма... Что делать с исчезающими полями?
    Удалять? Дилемма...

    Я вообще не видел коробочных решение которые бы работали на "раз-два-три". Всегда есть нюансы.
    И есть conditions которые нужно вбить или вкрутить в эти решения.

    Написать скрипты которые извлекают метадату из одной и из другой БД не очень сложно. Но само практическое
    применение подобных скриптов - ограничено. И я думаю что это как раз та причина по которой коробочные
    "миграторы" не прижились.

    liquibase может помочь.
    Вроде как у него есть поддержка SQlite

    • Поддерживаю. Сам пользуюсь liquibase периодически.
    • Спасибо, я слышал про этот инструмент, но у меня сложилось впечатление что это что-то слишком тяжелое. Буду пробовать.

    Чтобы быстро сравнить структуры БД - достаточно сделать с обеих дампы без данных и открыть их в Meld, например, для визуального сравнения.

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Мария Код Ответ

    Для сравнения структур двух баз данных и создания скрипта миграции можно воспользоваться различными инструментами и подходами. Ниже приведен пример использования PHP для сравнения структур двух баз данных и создания скрипта миграции.

    1. Подключитесь к обеим базам данных с помощью PHP, используя подходящий драйвер (например, PDO для MySQL).
    2. Получите список таблиц из каждой базы данных и их структуру (например, с помощью запроса "SHOW TABLES" и "SHOW CREATE TABLE").
    3. Сравните структуры таблиц из обеих баз данных, сравнивая их имена и столбцы.
    4. На основе результатов сравнения создайте скрипт миграции, который будет изменять структуру таблицы в одной базе данных, чтобы она соответствовала структуре таблицы в другой базе данных.
    5. Сгенерируйте SQL-запросы для миграции, например, для добавления новых столбцов, изменения типов данных или удаления столбцов.
    6. Выполните эти SQL-запросы на целевой базе данных для применения миграции.

    Пример использования PHP для сравнения структур двух таблиц и создания скрипта миграции:

    // Подключение к базам данных
    $dsn1 = "mysql:host=localhost;dbname=db1";
    $username = "username";
    $password = "password";
    $pdo1 = new PDO($dsn1, $username, $password);
     
    $dsn2 = "mysql:host=localhost;dbname=db2";
    $pdo2 = new PDO($dsn2, $username, $password);
     
    // Получение списка таблиц и их структуры
    $stmt1 = $pdo1->query("SHOW TABLES");
    $tables1 = $stmt1->fetchAll(PDO::FETCH_COLUMN);
     
    $stmt2 = $pdo2->query("SHOW TABLES");
    $tables2 = $stmt2->fetchAll(PDO::FETCH_COLUMN);
     
    // Сравнение структур таблиц
    foreach ($tables1 as $table) {
        $stmt1 = $pdo1->query("SHOW CREATE TABLE $table");
        $create1 = $stmt1->fetch(PDO::FETCH_COLUMN);
     
        $stmt2 = $pdo2->query("SHOW CREATE TABLE $table");
        $create2 = $stmt2->fetch(PDO::FETCH_COLUMN);
     
        if ($create1 !== $create2) {
            // Генерация SQL-запросов для миграции
            $migration = "ALTER TABLE $table ...";
            // Выполнение SQL-запросов на целевой базе данных
            $pdo2->exec($migration);
        }
    }

    // Подключение к базам данных $dsn1 = "mysql:host=localhost;dbname=db1"; $username = "username"; $password = "password"; $pdo1 = new PDO($dsn1, $username, $password); $dsn2 = "mysql:host=localhost;dbname=db2"; $pdo2 = new PDO($dsn2, $username, $password); // Получение списка таблиц и их структуры $stmt1 = $pdo1->query("SHOW TABLES"); $tables1 = $stmt1->fetchAll(PDO::FETCH_COLUMN); $stmt2 = $pdo2->query("SHOW TABLES"); $tables2 = $stmt2->fetchAll(PDO::FETCH_COLUMN); // Сравнение структур таблиц foreach ($tables1 as $table) { $stmt1 = $pdo1->query("SHOW CREATE TABLE $table"); $create1 = $stmt1->fetch(PDO::FETCH_COLUMN); $stmt2 = $pdo2->query("SHOW CREATE TABLE $table"); $create2 = $stmt2->fetch(PDO::FETCH_COLUMN); if ($create1 !== $create2) { // Генерация SQL-запросов для миграции $migration = "ALTER TABLE $table ..."; // Выполнение SQL-запросов на целевой базе данных $pdo2->exec($migration); } }

    Это простой пример использования PHP для сравнения структур двух баз данных и создания скрипта миграции. В зависимости от сложности структур и требований к миграции могут потребоваться дополнительные шаги и проверки.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно