Django 迁移:关系已经存在
Django migrations : relation already exists
我在 Django 模型迁移方面遇到了问题。
我的应用程序中有一些模型,并且内部已经有一些数据。
当我在我的应用程序中添加一些模型时,我 运行 makemigrations
,应用程序报告没有变化。
我知道迁移时有时会出现一些错误,所以我删除了数据库中的 django_migrations table 并再次删除了 运行 makemigrations
,现在程序找到了我的新字段。
现在的问题是,如果我 运行 migrate
系统告诉我一些 table 已经存在。 (这是正确的,因为他们这样做了)。我不想删除那些 table,因为我已经有数据在里面了。
我不能运行 migrate --fake
,因为程序会认为我已经有所有 table,这不是真的。
所以,我正在寻找一种方法来告诉程序:运行 迁移,如果 table 存在则跳过它。 (--fake
吧)
另一个问题是为什么我会发生这种情况,makemigrations 无法识别我的更改(一些缓存问题,...)?
这样做怎么样?
python manage.py makemigrations
(如果您已经准备好迁移文件,请跳过此步骤)
它将为那个包创建迁移让我们说名字像 0001_initial.py
手动编辑文件,以便删除其中的所有模型,但已在数据库中创建的模型除外。
现在你做一个假迁移。这会将您的数据库与模型同步。
python manage.py migrate --fake
然后 运行 再次 makemigrations 以创建其余表以及新的迁移文件。
python manage.py makemigrations
关于您的另一个问题,为什么 makemigrations 没有识别您的模型可能是因为以下原因:
- 这些更改的迁移已存在于某些迁移文件中。
- 你错过了在 INSTALLED_APPS 中提到 package_name 但我相信你在这里做到了。
每次更改模型时,请尝试以下步骤:
python manage.py makemigrations [your app name]
然后:
python manage.py migrate
它应该可以正常工作。但请记住,如果您的表中已经有数据(行),您应该为每个查询指定默认值。
如果没有,Django 会提示你为它们指定默认值
或者您可以尝试在您的字段中使用 blank=True
或 null=True
,如下所示:
website = models.URLField(blank=True)
可能的原因是您在同一个文件夹中有另一个迁移以相同的前缀开始...也许您在另一个分支上的同一个 table 上进行了另一个迁移或提交,所以它被保存到具有相同前缀的数据库,即:00010_migration_from_commit_#10,00010_migration_from_commit_#11
解决方法是像这样重命名迁移文件00011_migration_from_commit_#11
我尝试编辑相关的迁移文件并评论了创建该特定列的部分,然后 运行 python manage.py migrate
主要问题是现有表禁止迁移新表,因此解决方案很简单:
** 尝试将 managed = False 添加到现有的 dB,这样它就不会被 migrate
检测到
** 对所有现有的旧表重做:
class Meta:
managed=False
当我们在同一个应用程序中有很多表时,有时会很无聊,但它工作得很好!
我在 Django 模型迁移方面遇到了问题。
我的应用程序中有一些模型,并且内部已经有一些数据。
当我在我的应用程序中添加一些模型时,我 运行 makemigrations
,应用程序报告没有变化。
我知道迁移时有时会出现一些错误,所以我删除了数据库中的 django_migrations table 并再次删除了 运行 makemigrations
,现在程序找到了我的新字段。
现在的问题是,如果我 运行 migrate
系统告诉我一些 table 已经存在。 (这是正确的,因为他们这样做了)。我不想删除那些 table,因为我已经有数据在里面了。
我不能运行 migrate --fake
,因为程序会认为我已经有所有 table,这不是真的。
所以,我正在寻找一种方法来告诉程序:运行 迁移,如果 table 存在则跳过它。 (--fake
吧)
另一个问题是为什么我会发生这种情况,makemigrations 无法识别我的更改(一些缓存问题,...)?
这样做怎么样?
python manage.py makemigrations
(如果您已经准备好迁移文件,请跳过此步骤)
它将为那个包创建迁移让我们说名字像 0001_initial.py
手动编辑文件,以便删除其中的所有模型,但已在数据库中创建的模型除外。
现在你做一个假迁移。这会将您的数据库与模型同步。
python manage.py migrate --fake
然后 运行 再次 makemigrations 以创建其余表以及新的迁移文件。
python manage.py makemigrations
关于您的另一个问题,为什么 makemigrations 没有识别您的模型可能是因为以下原因:
- 这些更改的迁移已存在于某些迁移文件中。
- 你错过了在 INSTALLED_APPS 中提到 package_name 但我相信你在这里做到了。
每次更改模型时,请尝试以下步骤:
python manage.py makemigrations [your app name]
然后:
python manage.py migrate
它应该可以正常工作。但请记住,如果您的表中已经有数据(行),您应该为每个查询指定默认值。
如果没有,Django 会提示你为它们指定默认值
或者您可以尝试在您的字段中使用 blank=True
或 null=True
,如下所示:
website = models.URLField(blank=True)
可能的原因是您在同一个文件夹中有另一个迁移以相同的前缀开始...也许您在另一个分支上的同一个 table 上进行了另一个迁移或提交,所以它被保存到具有相同前缀的数据库,即:00010_migration_from_commit_#10,00010_migration_from_commit_#11
解决方法是像这样重命名迁移文件00011_migration_from_commit_#11
我尝试编辑相关的迁移文件并评论了创建该特定列的部分,然后 运行 python manage.py migrate
主要问题是现有表禁止迁移新表,因此解决方案很简单:
** 尝试将 managed = False 添加到现有的 dB,这样它就不会被 migrate
检测到** 对所有现有的旧表重做:
class Meta:
managed=False
当我们在同一个应用程序中有很多表时,有时会很无聊,但它工作得很好!