Can';在django 1.7上的数据迁移中,在原子块结束之前,我不会执行查询

Can';在django 1.7上的数据迁移中,在原子块结束之前,我不会执行查询,django,data-migration,Django,Data Migration,我有一个相当长的数据迁移,我正在做,以纠正早期错误的迁移,其中一些行创建不正确。我试图根据旧列为新列赋值,但是,有时这会导致完整性错误。当这种情况发生时,我想扔掉导致完整性错误的那个 以下是一段代码片段: def load_data(apps, schema_editor): MyClass = apps.get_model('my_app', 'MyClass') new_col_mapping = {old_val1: new_val1, ....} for in

我有一个相当长的数据迁移,我正在做,以纠正早期错误的迁移,其中一些行创建不正确。我试图根据旧列为新列赋值,但是,有时这会导致完整性错误。当这种情况发生时,我想扔掉导致完整性错误的那个

以下是一段代码片段:

def load_data(apps, schema_editor):
    MyClass = apps.get_model('my_app', 'MyClass')

    new_col_mapping = {old_val1: new_val1, ....}

    for inst in MyClass.objects.filter(old_col=c):

        try:
            inst.new_col = new_col_mapping[c]
            inst.save()

        except IntegrityError:
            inst.delete()
然后在我的
迁移
类的操作中

operations = [
    migrations.RunPython(load_data)
]
我在运行迁移时遇到以下错误

django.db.transaction.TransactionManagementError: An error occurred in the current transaction. You can't execute queries until the end of the 'atomic' block
我有这样的感觉

with transaction.atomic():
某个地方是我的解决方案,但我不确定正确的地方在哪里。更重要的是,我想了解为什么这是必要的

这类似于

首先,如果您还没有所需的导入,请添加它

from django.db import transaction
然后在原子块中封装可能引发完整性错误的代码

try:
    with transaction.atomic():
        inst.new_col = new_col_mapping[c]
        inst.save()
except IntegrityError:
    inst.delete()

错误原因在警告块“避免捕获原子内部的异常!”中解释在文档中。一旦Django遇到数据库错误,它将回滚原子块。尝试任何其他数据库查询将导致出现您看到的
TransactionManagementError
。通过将代码包装在一个原子块中,只有该代码才会回滚,并且您可以在该块之外执行查询。

每次迁移都围绕一个事务进行,因此当迁移过程中出现故障时,所有操作都将取消。因此,每一个失败的事务都不能接受新的查询(它们无论如何都会被取消)


使用transaction.atomic()将某些操作包装为
不是一个好的解决方案,因为当某些操作失败时,您将无法取消该操作。相反,在保存数据之前进行更多检查以避免完整性错误。

似乎同一异常可能有多种原因。在我的例子中,它是由一个无效的模型字段名引起的:我使用了希腊字母delta
我不确定为什么使用
transaction.atomic()。这些行做得不正确,事实上很糟糕,我想把它们处理掉