poloniumv's

Перенос БД Django-проекта с MySQL на PostgreSQL

18 июля 2017 г. 19:27

Для экспериментов и наведения порядка в коде проекта пришлось поднять его копию в песочнице. Отличия, правда, некоторые имеются: не apache2 в ней, но nginx, и не MySQL/MariaDB, но PostgreSQL.

С первым отличием справляться долго не пришлось. Поднял очередной virtualenv, да почти копипастой с других проектов в песочнице создал два конфига (один для nginx, второй для gunicorn).

А вот перенести БД не так просто и быстро. Вернее, и просто, и быстро, если уже опыт имеется. А мне раньше не приходилось.

Итак, на основном хосте создал пользователя с правом доступа к БД с адреса песочницы:

GRANT SELECT ON имя_бд.* TO 'имя_пользователя'@'IP-адрес_песочницы' IDENTIFIED BY 'пароль';

В песочнице же, где PostgreSQL, при помощи manage.py migrate воссоздал необходимую структуру БД.

Далее поставил в песочнице необходимый мегаинструмент:

sudo pip2 install py-mysql2pgsql

Для того чтобы сгенерился конфиг, куда надо прописать логины с паролями да прочую информацию для успешной миграции, запустил свежеустановленный мегаинструмент:

py-mysql2pgsql

Его выхлоп подсказал имя конфига:

No configuration file found.
A new file has been initialized at: mysql2pgsql.yml
Please review the configuration and retry...

В который я, не медля, прописал логины с паролями да прочую информацию.

mysql:
 hostname: IP-адрес-mysql-БД
 port: 3306
 socket: 
 username: имя_пользователя
 password: пароль
 database: имя_БД
 compress: false
destination:
 # if file is given, output goes to file, else postgres
 file: 
 postgres:
  hostname: localhost
  port: 5432
  username: имя_пользователя
  password: пароль
  database: имя_БД

Далее пришлось чутка подправить lib/python2.7/site-packages/mysql2pgsql/lib/postgres_writer.py, поскольку получил ошибку Exception: unknown datetime(6)

А именно заменить строку

elif column['type'] == 'datetime':

на

elif column['type'] == 'datetime' or column['type'].startswith('datetime('):

После этого запустил мегаинструмент еще раз и, не успев даже треть сигареты скурить, получил желаемое.