我有一个Django 1.7迁移,看起来像这样:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
def units_to_m2m(apps, schema_editor):
Interval = apps.get_model("myapp", "Interval")
IntervalUnit = apps.get_model("myapp", "IntervalUnit")
for interval in Interval.objects.all():
IntervalUnit(
interval=interval,
unit=interval.unit,
base_date=interval.base_date
).save()
class Migration(migrations.Migration):
dependencies = [
('otherapp', '0007_auto_20150310_1400'),
('myapp', '0009_auto_20150316_1608'),
]
operations = [
migrations.CreateModel(
name='IntervalUnit',
# ...
),
# ...
migrations.AddField(
model_name='interval',
name='units',
field=models.ManyToManyField(to='otherapp.Unit', through='myapp.IntervalUnit'),
preserve_default=True,
),
migrations.RunPython(units_to_m2m),
migrations.RemoveField(
model_name='interval',
name='unit',
),
migrations.RemoveField(
model_name='interval',
name='base_date',
),
]
当我运行时manage.py migrate
,它可以正常迁移。manage.py test
但是,当我运行时,它将尝试创建测试数据库,然后在此迁移过程中失败,并显示以下错误:
Traceback (most recent call last):
...
File "/home/adam/myproject/myapp/migrations/0010_auto_20150317_1516.py", line 10, in units_to_m2m
for interval in Interval.objects.all():
...
django.db.utils.OperationalError: (1054, "Unknown column 'myapp_interval.base_date' in 'field list'")
之后,当我连接到测试数据库时(不会删除它),即使迁移过程中途崩溃,数据库结构也将按照您的预期运行。这里发生了什么?
编辑:我已经尝试将迁移分为三个单独的迁移,一个迁移包含一个迁移之前的所有内容RunPython
,一个包含RunPython
其自身的内容,另一个包含之后的所有内容;它仍然在做完全相同的事情。
事实证明,迁移已按照预期的顺序成功运行,但是我有两个数据库,并且在两个平台上都运行了我的迁移,而无需咨询数据库路由器。跟踪此问题的Django票证是#23273,该票证仍然开放。
大概是,RunPython
迁移是针对default
(已经迁移的)查询而不是针对迁移实际上应该在其上运行的数据库的查询。
就我而言,我们不再需要将第二个数据库用于任何事情,因此我们可以将其settings.DATABASES
完全删除。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句