Как преобразовать дамп базы данных в другую СУБД
Занимаясь разработкой форумного движка Intellect Board, я столкнулся с двумя задачами:
- нужно отслеживать изменения в структуре БД для выпуска обновлений
- преобразовывать скрипт с SQL-операторами создания таблиц для MySQL в SQL для Postgres, SQLite, и, возможно, других СУБД.
И то, и другое — задачи весьма рутинные, и хотелось бы их автоматизировать. Довольно долго я искал решения для этого, но попалась только утилита mysqldiff (весьма неудобная и с множеством ограничений) и ряд платных программ, использование которых для меня неприемлемо.
Недавно я нашел модуль для Perl и набор готовых утилит к нему, который помог мне решить эти задачи. Модуль называется SQL::Translator.
Установить его можно через cpan:
cpan install SQL::TranslatorДалее можно либо сделать скрипт на языке Perl, который будет выполнять необходимые преобразования, либо использовать одну из готовых утилит: sqlt и sqlt-diff.
Утилита sqlt позволяет преобразовать файл из одного формата в другой. Исходный формат указывается после ключа -f, кончный — после -t. Например, конвертация из MySQL в SQLite выглядит так:
sqlt -f MySQL -t SQLtie исходный_файл.sql > конечный_файл.sql
Преобразование из PostgreSQL в MySQL — так:
sqlt -f PostgreSQL -t MySQL исходный_файл.sql > конечный_файл.sql
Кроме различных SQL-диалектов, поддерживаются еще JSON, Yaml, XML и ряд других.
Отслеживать изменения в структуре БД можно с помощью sqlt-diff. К сожалению, работает она только с дампами, а сравнивать дамп и то, что есть на сервере, не может.
Работать с ней весьма просто:
sqlt-diff файл1.sql=СУБД файл2.sql=СУБД > файл_изменний.sql
В результате выполнения будет создан файл с SQL-операторами ALTER TABLE, CREATE TABLE и DROP TABLE, позволяющий привести структуру базы данных из файла1 к структуре файла2.