Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在一次Django迁移中向SQLite3添加多个字段_Python_Django_Python 3.x_Sqlite_Migration - Fatal编程技术网

Python 在一次Django迁移中向SQLite3添加多个字段

Python 在一次Django迁移中向SQLite3添加多个字段,python,django,python-3.x,sqlite,migration,Python,Django,Python 3.x,Sqlite,Migration,我有一个SQLite3表,大约有200万行和30列。我需要在模型中再添加4个字段。我将新字段添加到models.py,运行manage.py makemigrations,然后运行manage.py migrate。当我检查SQL查询时,Django会为每个新字段创建一个新表(并删除旧表),而不是在添加了所有4个字段的情况下创建一个新表。这会将迁移时间增加4倍,从而导致约1小时。是否有可能以某种方式对其进行优化,并强制Django在单个createtable语句中添加所有4个字段 我的当前迁移

我有一个SQLite3表,大约有200万行和30列。我需要在模型中再添加4个字段。我将新字段添加到
models.py
,运行
manage.py makemigrations
,然后运行
manage.py migrate
。当我检查SQL查询时,Django会为每个新字段创建一个新表(并删除旧表),而不是在添加了所有4个字段的情况下创建一个新表。这会将迁移时间增加4倍,从而导致约1小时。是否有可能以某种方式对其进行优化,并强制Django在单个
createtable
语句中添加所有4个字段


我的当前迁移文件:

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),
        )
    ]
“使用Django ORM不适合于实际的数据库操作。当然,当您仅执行基本CRUD操作时,它可能看起来很好(ish)。但它将迫使您以最不优化的方式执行数据库查询(请参阅N+1选择问题)

它的语法不一致,并且它缺乏对许多SQL功能(包括JOIN)的支持,这将使您在遇到困难时立即返回原始SQL查询。当您使用ORM时,返回原始SQL感觉有点像失败,而且不容易维护。”---

你可以查一下

这可以帮助你在一条语句中运行

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')

命令
makemigrations
生成多少迁移文件?1或4?@Ibris 1文件包含4个AddField操作您能否共享它,以便我们可以确定我们可以做什么?如果有4个文件,我会建议将它们合并成1个。我知道可以编写自定义迁移脚本。也许我们可以自定义自动生成的一个。@Ibris我在原始问题中添加了迁移文件似乎不允许在一个查询中添加多个字段。但正如我所说,您可以编写自己的迁移代码。看,在那里你可以做一些特别的事情。