2

我在 django 模型迁移方面遇到了麻烦。我的应用程序中有一些模型,并且里面已经有一些数据。当我在我的应用程序中添加一些模型并运行makemigrations时,应用程序报告说没有变化。我知道迁移时有时会出现一些错误,所以我删除了数据库中的 django_migrations 表并makemigrations再次运行,现在程序找到了我的新字段。

现在的问题是,如果我运行migrate系统告诉我一些表已经存在。(这是好的和正确的,因为他们这样做)。我不想删除那些表,因为我里面已经有数据了。

我无法运行migrate --fake,因为程序会认为我已经拥有所有表格,这是不正确的。

所以,我正在寻找一种方法来告诉程序:运行迁移,如果表存在则跳过它。(--fake它)

另一个问题是为什么这发生在我身上,makemigrations 无法识别我的更改(一些缓存问题,...)?

4

5 回答 5

17

这样做怎么样?

python manage.py makemigrations

(如果您已经准备好迁移文件,请跳过此步骤)

它将为该包创建迁移,可以说名称为 0001_initial.py

手动编辑该文件,以便删除那里的所有模型,但已在数据库中创建的模型除外。

现在你做了一个假迁移。这将使您的数据库与模型同步。

python manage.py migrate --fake

然后再次运行 makemigrations 以创建其余表以及新的迁移文件。

python manage.py makemigrations

关于您的其他问题,为什么 makemigrations 无法识别您的模型可能是由于以下原因:

  1. 这些更改的迁移已经存在于某些迁移文件中。
  2. 您错过了在 INSTALLED_APPS 中提及 package_name,但我相信您在这里做到了。
于 2017-10-26T11:20:15.163 回答
1

每次更改模型时,请尝试以下步骤:

python manage.py makemigrations [your app name]

然后:

python manage.py migrate

它应该可以正常工作。但请记住,如果您的表中已经有数据(行),您应该为每个查询指定默认值。
如果没有,Django 会提示您为它们指定默认值,或者您可以尝试使用blank=Truenull=True在您的字段中,如下所示:

website         = models.URLField(blank=True)
于 2017-10-26T11:39:05.290 回答
0

可能的原因,或者这是您在同一个文件夹中有另一个迁移以相同的前缀开始......也许您在另一个分支上的同一个表上进行另一个迁移或提交,因此它以相同的前缀保存到数据库,即:00010_migration_from_commit_ #10, 00010_migration_from_commit_#11

解决方案是像这样重命名迁移文件 00011_migration_from_commit_#11

于 2019-12-29T06:30:19.840 回答
0

主要问题是禁用新表迁移的现有表,因此解决方案很简单:

** 尝试将 managed = False 添加到现有的 dB,这样它就不会被 migrate 检测到

** 为所有现有的旧表重做:

class Meta:
    managed=False

当我们在同一个应用程序中有很多表时,有时会很无聊,但它工作得很好!

于 2020-11-27T15:02:48.813 回答
0

我尝试编辑相关的迁移文件并评论了它创建该特定列的部分,然后运行python manage.py migrate

于 2020-09-27T10:13:38.597 回答