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