Добавление нескольких полей в SQLite3 за одну миграцию Django - PullRequest
1 голос
/ 01 марта 2020

У меня есть таблица SQLite3 с ~ 2 миллионами строк и ~ 30 столбцами. Мне нужно добавить еще 4 поля в модель. Я добавляю новые поля в models.py, запускаю manage.py makemigrations, а затем manage.py migrate. Когда я проверяю SQL запросов, Django создает новую таблицу (и удаляет старую) для каждого нового поля вместо создания новой таблицы один раз со всеми 4 добавленными полями. Это увеличивает время миграции в 4 раза, что приводит к ~ 1 часу. Можно ли как-то оптимизировать это и заставить Django добавить все 4 поля в одном операторе CREATE TABLE?


Мой текущий файл миграции:

from django.db import migrations, models

class Migration(migrations.Migration):

    dependencies = [
        ('my_project', '0017_auto_20200218_1325'),
    ]

    operations = [
        migrations.AddField(
            model_name='ads',
            name='type',
            field=models.CharField(max_length=30, null=True),
        ),
        migrations.AddField(
            model_name='my_project',
            name='color',
            field=models.CharField(max_length=30, null=True),
        ),
        migrations.AddField(
            model_name='my_project',
            name='damage',
            field=models.CharField(max_length=30, null=True),
        ),
        migrations.AddField(
            model_name='my_project',
            name='euro',
            field=models.CharField(max_length=20, null=True),
        )
    ]

1 Ответ

1 голос
/ 01 марта 2020

"Использование Django ORM не подходит для реальных операций с базой данных. Конечно, это может выглядеть нормально (i sh), когда вы выполняете только базовые c операции CRUD. Но это заставит вас выполнять запросы к базе данных наименее оптимизированным способом (см. проблему N + 1 SELECT)…

Его синтаксис непоследователен, а отсутствие поддержки многих функций SQL (включая JOIN) заставит вас go вернуться к raw SQL запрашивает, как только все становится сложным. Возвращаясь к raw SQL, при использовании ORM это немного похоже на сбой, плюс его нелегко поддерживать ». --- Почему бы нам не использовать Django ORM?

Вы можете выбрать инструмент переноса базы данных

, который может помочь вам выполнить один оператор

def upgrade():
    op.create_table(
    'account',
    sa.Column('id', sa.Integer, primary_key=True),
    sa.Column('name', sa.String(50), nullable=False),
    sa.Column('description', sa.Unicode(200)),
)

def downgrade():
    op.drop_table('account')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...