Ускорение Django миграций в большой базе данных - PullRequest
1 голос
/ 08 мая 2020

У меня есть MySQL БД с несколькими таблицами, каждая из которых имеет почти 2M записей. Когда я запускаю миграцию, которая обновляет эти таблицы, это происходит очень медленно. Я попытался увеличить сервер до 64 ЦП и 240 ГБ ОЗУ (вероятно, действительно ненужно), но это все еще занимает слишком много времени.

Есть ли способ ускорить миграцию?

РЕДАКТИРОВАТЬ: Как указано автор @ iklina c, я видел этот пост о создании новой временной таблицы и последующем переносе данных из старой таблицы в эту новую. Есть ли "Django способ" сделать это?

1 Ответ

1 голос
/ 08 мая 2020

Вы можете запустить SQL запросов в Django миграциях, записав миграции или отредактировав файл миграции самостоятельно, используя Выполнить SQL операции

class Run SQL (sql, reverse_sql = None, state_operations = None, hints = None, elidable = False)

Позволяет запускать произвольные SQL в базе данных - полезно для более сложных функций базы данных бэкэнды, которые Django не поддерживают напрямую.

С аргументом state_operations

аргумент state_operations позволяет вам предоставлять операции, эквивалентные SQL с точки зрения состояние проекта. Например, если вы вручную создаете столбец, вы должны передать сюда список, содержащий операцию AddField, чтобы автодетектор по-прежнему имел актуальное состояние модели. Если вы этого не сделаете, при следующем запуске makemigrations не увидит никаких операций, добавляющих это поле, и попытается запустить ее снова. Например:

migrations.RunSQL(
    "ALTER TABLE musician ADD COLUMN name varchar(255) NOT NULL;",
    state_operations=[
        migrations.AddField(
            'musician',
            'name',
            models.CharField(max_length=255),
        ),
    ],
)
...