Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.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 django1.7中带外键的可逆数据迁移_Python_Mysql_Django_Django Migrations - Fatal编程技术网

Python django1.7中带外键的可逆数据迁移

Python django1.7中带外键的可逆数据迁移,python,mysql,django,django-migrations,Python,Mysql,Django,Django Migrations,我正在使用django1.7、Python2.7和mysql。我正在编写一些测试来测试我的数据迁移是否正常工作,并且在这个过程中要求我的数据迁移是可逆的 class Migration(migrations.Migration): dependencies = [ ('myapp', '0001_initial'), ] operations = [ migrations.RunSQL("SET FOREIGN_KEY_CHECKS

我正在使用django1.7、Python2.7和mysql。我正在编写一些测试来测试我的数据迁移是否正常工作,并且在这个过程中要求我的数据迁移是可逆的

class Migration(migrations.Migration):  

    dependencies = [
        ('myapp', '0001_initial'),
    ]

    operations = [
        migrations.RunSQL("SET FOREIGN_KEY_CHECKS=0;", reverse_sql="SET FOREIGN_KEY_CHECKS=1;"),
        migrations.RunPython(load_fixture, reverse_code=unload_fixture),
        migrations.RunSQL("SET FOREIGN_KEY_CHECKS=1;", reverse_sql='')
    ]

def unload_fixture(apps, schema_editor):        
        with open(myfile, 'rb') as fixture:
            objects = serializers.deserialize('json', fixture, ignorenonexistent=True)
            for obj in objects:
                obj_name = type(obj.object).__name__
                Model = apps.get_model('myapp', obj_name)
                database_object = Model.objects.get(pk=obj.object.pk)
                if obj.object == database_object: #equality overridden, checks all fields
                    database_object.delete()

class RuleFile(MyAppModel):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=128)
    creator = models.ForeignKey(User, db_column='creator')
    firmware = models.ForeignKey(Firmware)
我需要将FOREIGN_KEY_CHECKS设置为0,这样我就可以插入数据迁移,否则它会在继续时抱怨缺少对外键的引用。现在,当我反转并删除对象时,它将抛出DoesNotExist错误,即使我可以在数据库中看到提到的对象,而且由于外键b/c,如果我不删除任何外键对象,我仍然可以在python中找到该对象,指示删除对象会影响后续删除其他对象。我的问题是,如何使用Django和外键正确地编写可逆的幂等数据迁移?我的理论是:

转发 -->如果对象在数据库中不存在,请添加该对象

逆转 -->仅当对象与fixture中的对象匹配时才删除该对象,以便可以将其添加回fixture

可能的方法 -使用事务,以便不会立即删除条目