我們的Django使用1.8和我們的項目遷移,我們多次遇到如下問題數據遷移不匹配:的Django與models.py
- 我們改變/添加模型遷移1
- 我們添加/改變一些數據,以滿足新的邏輯與遷移2
- 我們再次改變模型並創建遷移3
現在的開發者之一同步的3個新的遷移和遇到錯誤由於mismatc h在models.py和數據庫之間。
到目前爲止,我們要麼僞造遷移錯誤,要麼我們特別改變依賴關係。但這既不繫統也不方便。
有沒有更好的方法來解決這個問題?
以下是問題是如何產生的一個簡單的例子: 原models.py模型改變之前
class Test(models.Model):
a = models.CharField(max_length=200, verbose_name="A")
b = models.CharField(max_length=200, verbose_name="B")
遷移:
0001_initial.py
class Migration(migrations.Migration):
dependencies = [
]
operations = [
migrations.CreateModel(
name='Test',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('a', models.CharField(max_length=200, verbose_name=b'A')),
('b', models.CharField(max_length=200, verbose_name=b'B')),
],
),
]
0002_auto_20160308_1103.py
def testData(apps, schema_editor):
Test.objects.create(a="aaaa", b="bbb")
class Migration(migrations.Migration):
dependencies = [
('Test', '0001_initial'),
]
operations = [
migrations.RunPython(testData)
]
新models.py
class Test(models.Model):
a = models.CharField(max_length=200, verbose_name="A")
b = models.CharField(max_length=200, verbose_name="B")
c = models.CharField(max_length=200, verbose_name="C", default="c")
最後遷移:
0003_test_c.py
class Migration(migrations.Migration):
dependencies = [
('Test', '0002_auto_20160308_1103'),
]
operations = [
migrations.AddField(
model_name='test',
name='c',
field=models.CharField(default=b'c', max_length=200, verbose_name=b'C'),
),
]
運行migrate
結果django.db.utils.OperationalError: table Test_test has no column named c
在運行第二個遷移。
這絕不應該發生;遷移意味着*完全*此用例。這意味着你做錯了什麼。您應該準確解釋當您「由於不匹配而遇到錯誤」時發生的情況。 –
用可重現的示例修正了這個問題 –