【问题标题】:Django migrate won't update my databaseDjango migrate 不会更新我的数据库
【发布时间】:2016-02-16 13:38:07
【问题描述】:

从现有数据库开始,我想更新它的架构。我改变了我的一个模型,然后运行

python manage.py makemigrations myapp

创建迁移,正确定义新表和列。示例输出:

Migrations for 'myapp':
  0001_initial.py:
    - Create model Foo
    - Add field Bar
    - ...

然后我应用迁移:

python manage.py migrate --database mydb

我得到这个输出:

Operations to perform:
  Apply all migrations: admin, myapp, contenttypes, sessions, auth
Running migrations:
  Rendering model states... DONE
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying auth.0007_alter_validators_add_error_messages... OK

它似乎奏效了。 Git告诉我“mydb”对应的sqlite文件发生了变化。但是,它没有将我的新表和列放在里面,而是删除了内容,留下了旧模式的空表。

我做错了什么?

【问题讨论】:

  • 试试:python manage.py migrate myapp
  • 默认情况下,它会尝试应用所有可能的迁移(在我的例子中只有一个)。

标签: django django-migrations


【解决方案1】:

如果您有一个未应用迁移的旧数据库,您应该创建 initial migrations 而不做任何更改。这意味着如果您更改了“models.py”,请将其恢复为原始状态,然后运行:

python manage.py makemigrations myapp

然后运行“假”迁移

python manage.py migrate --database mydb --fake-initial

之后你可以修改你的“models.py”并使用正常的迁移。

【讨论】:

  • 我按照你的建议做了--fake-initial,我得到了与上面相同的输出。之后,python manage.py migrate [myapp] --database mydb 告诉我“没有要申请的迁移”。我的表是旧模式的空表。
  • 您是否从0001_initial.py 中删除了所有Alter fieldadd field 命令?
  • Django 也将每个完成的迁移存储在数据库中。这可能是 Git 检测到的。如果您开始在数据库中使用迁移,您应该创建类似于数据库阶段的“纯”迁移文件(不更改模型)。然后“伪造”这些迁移。现在您可以更改模型并进行正常迁移。
  • 所以我必须还原我的models.py,然后伪造它,然后更改模型,然后迁移,对吗?
  • 成功了,谢谢!无需删除 django_migrations 条目。我完全鄙视这种迁移制度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-11
  • 1970-01-01
  • 1970-01-01
  • 2014-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多