На примере базы сдвора разбираем процесс перехода с mysql на postgresql
создаем базу на постгрес
12sudo -u postgres psqlcreate database pgdatabasename;делаем виртуальное окружение для питона 2.7 и скачиваем утилиту py-mysql2pgsql
123virtualenv -p $(which python2.7) --no-site-packages ~/envs/py-mysql2pgsqlsource ~/envs/py-mysql2pgsql/bin/activatepip install py-mysql2pgsqlзапускаем
1py-mysql2pgsql -v
В консоли видим ошибку, что конфига нет. Все верно, мы создали его этой командой.
Открываем для правки любым текстовым редактором.
оставляем структуру как есть, правим часть с базами
- правим файл библиотеки утилиты (нужно чтобы не наткнуться на ошибку с переводом дат)
\mysql2pgsql\lib\postgres_writer.py строка 72
меняем
на
- запускаем утилиту еще раз
py-mysql2pgsql -v
натыкаемся на ошибку enum в базе shops
Правим колонки в mysql, заменяем enum на varchar
Запускаем скрипт снова, базу можно не дропать
в процессе можно наткнуться на такую ошибку
psycopg2.IntegrityError: insert or update on table “cart_items” violates foreign key constraint “cart_items_cart_id_fkey”
DETAIL: Key (cart_id)=(226567) is not present in table “cart”.
и как аналог
psycopg2.IntegrityError: insert or update on table “orders_pickups” violates foreign key constraint “orders_pickups_order_id_fkey”
DETAIL: Key (order_id)=(49595) is not present in table “orders”.
Ошибка говорит о том, что заказа, на который ссылается самовывоз, не существует. Нам такие записи в базе не нужны (по причине того, что связаны с уже неактуальным заказом) и в этом случае удаляем строку с соответствующим key_id из таблицы cart_items или другой, по аналогии.
- Если все прошло успешно, то у нас есть готовая база постгреса.
Меняем database ENGINE в сеттингах джанги на psycopg2, делаем makemigrations и migrate, сносим конфликтующие миграции (в случае сдвора были миграции orders и banners)