我使用的是django1.7,python 2.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进行可逆,幂等数据迁移?我的理论是:
转发 - >如果对象尚未存在于数据库中,则添加该对象
反向 - >仅当对象与夹具中的对象匹配时才移除对象,以便将其添加回来
可能的方法 - 使用交易,以便不立即删除条目