Можно действовать разными способами, в зависимости от ситуации. Мне требовалось вытащить данные из проекта на Python/Django/PostgreSQL, чтобы потом экспортировать их на какую либо платформу PHP/open-source-CMS/MySQL.
Ваша ситуация может сильно отличаться от моей, но данный гайд, если не полностью решит проблему, так позволит вам с чего то начать.
Мне нужна была структура таблиц и данные. Связи между таблицами, индексы, безопасность — все это можно было отправить в топку.
Этап 1. Делаем дамп. Болванка скрипта.
Здесь мы максимально приводим дамп базы к формату чтения его функцией импорта MySQL.
Для начала авторизируйтесь суперюзером postgres (обычно это одноименный пользователь). И выполните команду следующего вида:
1 |
pg_dump -U postgres -N -x -b -O --inserts -d [имя вашей базы] > /tmp/base-dump-filename.sql |
Если вы не знаете имя базы, зайдите в консоль postgres и введите команду «\l». Выйти из консоли можно набрав «\q».
Пояснения по назначению флажков для pg_dump можно запросить в помощи:
1 |
pg_dump --help |
Этап 2. Шлифовка.
Полученный дамп (болванка) уже будет довольно хорош в плане его совместимости с mySQL, но все равно потребует доработку «напильником». В качестве этого универсального инструмента я использую Notepad++.
Зачистим, используя регулярные выражения (нажмите CTRL+H), выберите режим поиска как на скриншоте:
Заменяем, используя следующие шаблоны:
- ALTER SEQUENCE[^;]+;
- ALTER TABLE ONLY[^;]+;
- CREATE.SEQ[^;]+;
- CREATE INDEX[^;]+;
- SELECT[^;]+;
- REVOKE ALL[^;]+;
- GRANT ALL[^;]+;
- timestamp with time zone заменяем на timestamp
- (\\») заменим на \\$1
- (\\u[0-9a-f]{4}) заменим на \\$1
Последняя замена позволит добавить символ экранирования перед закодированными UTF-8 символами вроде — \u0412\u0435\u0442, которые mySQL будет не верно обрабатывать из-за одиночного бек-слеша.
Останутся несколько моментов, которые надо сделать вручную.
Во-первых, это экранирование столбцов в командах CREATE TABLE. PostgreSQL в отличии от MySQL пользуется двойной кавычкой. В полученном дампе, «квотирование» будет проведено только для названий столбцов таблиц, совпадающих с зарезервированными словами. В этих случаях нужно заменить ″ на `.
В самом начале дампа идут некоторые дефиниции (до первого CREATE TABLE). Их, скорее всего, тоже надо удалить.
Этап 3. Полировка.
Возможно, возникнут ещё какие то мелочи, вы о них узнает только в момент исполнения скрипта под MySQL. Из-за чего «полировка» будет много-итерационной.
Запускаем скрипт. Смотрим, что не нравится MySQL. Удаляем последствия неудачного выполнения скрипта. Правим скрипт. Снова запускаем.