Инструкция: как перевести проект Django с SQLite на MySQL без боли

SQLite3 является СУБД-движком по умолчанию в Python веб-фреймворке Django, а также, как сообщается на официальном сайте проекта, самым часто используемым движком в мире. И он отлично походит для быстрого прототипирования веб-проекта, однако имеет ряд недостатков, о которых мы рассказывали в одной из статей на нашем сайте, и по мере роста веб-приложения приходится переходить на полнофункциональную РСУБД — например, MySQL. И здесь разработчик может столкнуться с проблемами. Мы предлагаем воспользоваться нижеследующей инструкцией, чтобы их избежать или хотя бы максимально снизить вероятность их появления.

Инструкция написана для следующей конфигурации: Ubuntu 16.04, Python 3.5.2, Django 1.10.4.

  1. Установка сервера и консольного клиента MySQL:
    $ sudo apt-get install mysql-server mysql-client

    В процессе установки сервера перед вами появится окошко с предложением задать пароль для root-пользователя MySQL.

  2. Создание базы данных для работы веб-приложения Django:
    $ mysql -u root -p

    Вы перейдете в консольный клиент MySQL. Введите пароль root-пользователя, заданный в диалоговом окне на предыдущем шаге. В консольном клиенте введите следующую команду:

    mysql> CREATE DATABASE 'someapp' DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

    Замените «someapp» на название вашего приложения в Django. Задание CHARACTER SET необходимо для корректной работы Django с базой данных.

  3. Создание отдельного пользователя для Django в MySQL:
    mysql> CREATE USER 'django'@'localhost' IDENTIFIED BY 'password';
    mysql> GRANT ALL PRIVILEGES ON 'someapp'.* TO 'django'@'localhost';
    mysql> FLUSH PRIVELEGES;

    Укажите свой пароль вместо «password» и название своего приложения вместо «someapp». Второй и третьей командой пользователю django выдаются права на созданную ранее таблицу.

  4. Нажмите Ctrl-D для выхода из консольного клиента MySQL.
  5. Установка библиотек и пакетов, необходимых для работы с MySQL из Python:
    $ sudo apt-get install python3-dev libmysqlclient-dev
    $ pip install mysqlclient
    

    Обратите внимание, что mysqlclient является форком официального драйвера MySQLdb, но мы используем первый, потому что он поддерживает Python 3. На момент написания статьи MySQLdb не поддерживает третью версию языка.

  6. Создание дампа данных:
    $ python manage.py dumpdata --indent=2 --exclude=contenttypes > datadump.json

    При выполнении этой команды все еще используется SQLite БД — именно из нее выгружаются данные.

  7. Изменение настроек проекта на использование MySQL:
    # инструкция с официального сайта djangoproject.com
    # settings.py
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'OPTIONS': {
                'read_default_file': '/path/to/my.cnf',
            },
        }
    }
    # my.cnf
    [client]
    database = someapp
    user = django
    password = PASSWORD
    default-character-set = utf8

    Замените «someapp» на название созданной вами для приложения базы данных. Также обратите внимание, что вам необходимо задать корректный путь к файлу в первом фрагменте кода.

  8. Проведите миграции в Django и загрузите данные:
    $ python manage.py makemigrations
    $ python manage.py migrate --run-syncdb
    $ python manage.py loaddata datadump.json

Теперь ваши данные успешно перенесены в СУБД MySQL. В случае если у вас возникнут трудности при точном следовании этой инструкции, сообщайте в комментариях к этой статье — будем разбираться и добавлять примечания, чтобы сформировать универсальное руководство.

Основано на ответе пользователя Carlos Henrique Cano на Stack Overflow и собственном опыте