Python django1.7中带外键的可逆数据迁移
我正在使用django1.7、Python2.7和mysql。我正在编写一些测试来测试我的数据迁移是否正常工作,并且在这个过程中要求我的数据迁移是可逆的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
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
可能的方法
-使用事务,以便不会立即删除条目