正如标题所说,我似乎无法让迁移工作。
该应用最初的版本低于1.6,因此我了解迁移最初并不存在,而且如果我运行python manage.py migrate
,我会得到:
Operations to perform:
Synchronize unmigrated apps: myapp
Apply all migrations: admin, contenttypes, auth, sessions
Synchronizing apps without migrations:
Creating tables...
Installing custom SQL...
Installing indexes...
Running migrations:
No migrations to apply.
如果我对myapp
中的任何模型进行了更改,它仍然会按预期显示未迁移。
但如果我跑python manage.py makemigrations myapp
,我得到:
No changes detected in app 'myapp'
我运行命令的内容和方式似乎无关紧要,它从未检测到应用程序有更改,也没有将任何迁移文件添加到应用程序。
有没有办法迫使应用程序进行迁移,基本上可以说"这是我的基础"还是什么?或者我错过了什么?
我的数据库是一个PostgreSQL,如果它有帮助的话。
答案 0 :(得分:176)
如果您要从django 1.6中的现有应用程序进行切换,那么您需要执行文档中列出的一个预步骤(我发现):
python manage.py makemigrations your_app_label
文档并没有明确表示您需要在命令中添加应用程序标签,因为它告诉您的第一件事是python manage.py makemigrations
将失败。初始迁移是在1.7版本中创建应用程序时完成的,但如果您来自1.6,则不会执行。有关详细信息,请参阅文档中的'Adding migration to apps'。
答案 1 :(得分:30)
这可能由于以下原因而发生:
INSTALLED_APPS
settings.py
列表中添加该应用
(您必须在应用程序文件夹的apps.py中添加应用程序名称或虚线路径到AppConfig的子类,具体取决于您使用的django版本)。请参阅文档: INSTALLED_APPS migrations
文件夹。 (解决方案:只创建该文件夹)。__init__.py
文件夹中没有 migrations
文件。 (解决方案:只需创建一个名为 __ init __。py )__init__.py
文件。 (解决方案:只需创建一个名为 __ init __。py )models.py
文件models.py
中的Python类(应该是模型)不会继承 django.db.models.Model
models.py
注意:强>
常见的错误是在migrations
文件中添加.gitignore
文件夹。从远程仓库克隆时,本地仓库中将丢失migrations
文件夹和/或__init__.py
文件。这会导致问题。
我建议通过将以下行添加到.gitignore
文件
*/migrations/*
!*/migrations/__init__.py
答案 2 :(得分:27)
好吧,看起来我错过了一个显而易见的步骤,但发布这个以防其他人也这样做。
升级到1.7时,我的模型变得不受管理(managed = False
) - 我之前将它们设为True
但似乎已恢复。
删除该行(默认为True)然后立即运行makemigrations
创建了一个迁移模块,现在它正在运行。 makemigrations
将不适用于非托管表(事后很明显)
答案 3 :(得分:18)
我的解决方案不在此处,所以我发布了它。我一直在使用syncdb
作为项目 - 只是为了让它运行起来。然后,当我尝试开始使用Django迁移时,它首先伪造它们然后会说它“OK”但数据库没有发生任何事情。
我的解决方案是删除我的应用程序的所有迁移文件,以及作为django_migrations
表中应用程序迁移的数据库记录。
然后我刚刚进行了初始迁移:
./manage.py makemigrations my_app
接下来是:
./manage.py migrate my_app
现在我可以毫无问题地进行迁移。
答案 4 :(得分:15)
同意@furins。如果一切看起来都是有序的,但是出现了这个问题,请检查是否有任何属性方法与您尝试在Model类中添加的属性具有相同的标题。
答案 5 :(得分:11)
这是一个愚蠢的错误,但在模型类的字段声明行的末尾有一个额外的逗号,使该行无效。
复制粘贴def时会发生这种情况。来自迁移,它本身被定义为一个数组。
虽然这可能对某人有所帮助: - )
答案 6 :(得分:10)
也许我为时已晚,但您是否尝试在应用中设置migrations
文件夹,其中包含__init__.py
个文件?
答案 7 :(得分:7)
答案在这个stackoverflow帖子上,由cdvv7788 Migrations in Django 1.7
如果您是第一次迁移该应用,则必须使用:
manage.py makemigrations myappname完成后,您可以执行以下操作:
manage.py migrate如果您的应用程序位于数据库中,请修改其模型 并且它没有更新你可能没有的makemigrations的更改 迁移了它。将模型更改回原始形式,运行 第一个命令(使用应用程序名称)并迁移...它会伪造它。一旦 你这样做会在模型上放回更改,运行makemigrations和 再次迁移,它应该工作。
我遇到了同样的麻烦,并且完成了上述工作。
我已将我的django应用程序移至cloud9,由于某种原因,我从未捕获过初始迁移。
答案 8 :(得分:7)
以下为我工作:
为我工作:Python 3.4,Django 1.10
答案 9 :(得分:6)
也许这会对某人有所帮助。我正在使用嵌套的应用程序。 project.appname和我实际上在INSTALLED_APPS中有project和project.appname。从INSTALLED_APPS中删除项目允许检测到更改。
答案 10 :(得分:6)
像我这样不喜欢迁移的人可以使用以下步骤。
python manage.py makemigrations app_label
进行初始迁移。python manage.py migrate
以创建表。如果您对这些步骤中的任何一个感到困惑,请阅读迁移文件。更改它们以更正您的架构或删除不需要的文件,但不要忘记更改下一个迁移文件的依赖项部分;)
我希望这将有助于将来。
答案 11 :(得分:5)
您想查看settings.py
列表中的INSTALLED_APPS
,并确保其中列出了所有带模型的应用。
在项目文件夹中运行makemigrations
意味着它将查找更新与项目settings.py
中包含的所有应用程序相关的所有表。在您加入后,makemigrations
会自动加入该应用(这可以节省大量工作,因此您不必为项目/网站中的每个应用运行makemigrations app_name
。
答案 12 :(得分:4)
如果您有一个特定字段无法通过makemigrations识别:如果您有一个具有相同名称的属性,请检查两次。
示例:
field = django.db.models.CharField(max_length=10, default = '', blank=True, null=True)
# ... later
@property
def field(self):
pass
该属性将"覆盖"字段定义因此makemigrations
答案 13 :(得分:4)
添加此答案,因为只有这种方法对我有帮助。
我删除了 migrations
文件夹makemigrations
和migrate
。
它仍然说:无需迁移。
我转到 migrate
文件夹并打开最后创建的文件,
评论我想要的迁移(它被检测到并进入那里)
并再次运行migrate
。
这基本上是手动编辑迁移文件 仅在您了解文件内容时执行此操作。
答案 14 :(得分:4)
确保您的模型不是abstract
。我实际上犯了这个错误并花了一段时间,所以我想我会发布它。
答案 15 :(得分:3)
重命名旧的迁移文件夹后,您是否使用过schemamigration my_app --initial
?试试吧。可能会工作。如果不是 - 尝试重新创建数据库并进行syncdb + migrate。它对我有用......
答案 16 :(得分:1)
对于我来说,我需要将模型添加到定义了模型的models文件夹的_ init _。py文件中:
from myapp.models.mymodel import MyModel
答案 17 :(得分:1)
答案 18 :(得分:1)
遇到相同的问题 确保您在models.py中定义了任何类,都必须继承models.Model类。
class Product(models.Model):
title = models.TextField()
description = models.TextField()
price = models.TextField()
答案 19 :(得分:1)
我最近将Django从1.6升级到1.8,并且几乎没有应用程序和迁移。我使用south和schemamigrations
在Django 1.6中创建了迁移,它在Django 1.8中被删除。
升级后添加新模型时,makemigrations
命令未检测到任何更改。然后我尝试了@drojf建议的解决方案(第一个答案),它工作正常,但未能应用虚假的初始迁移(python manage.py --fake-initial
)。我这样做是因为我的桌子(旧桌子)已经创建了。
最后这对我有用,从models.py中删除了新模型(或模型更改),然后必须删除(或重命名安全备份)所有应用程序的迁移文件夹,并为所有应用程序运行python manage.py
makemigrations ,然后python manage.py migrate --fake-initial
。这就像一个魅力。为所有应用创建初始迁移并假冒初始迁移后,添加新模型并遵循常规流程makemigrations
并在该应用上迁移。现在检测到这些变化,一切都很顺利。
我只是想在这里分享它,如果有人面临同样的问题(他们的应用程序有南schemamigrations
),它可能会帮助他们:)
答案 20 :(得分:1)
./manage makemigrations
./manage migrate
迁移跟踪对数据库的更改,因此如果您从非托管更改为托管,则需要确保您的数据库表是与您正在处理的模型相关的最新版本。
如果您仍处于开发模式,我个人决定删除IDE中的迁移文件以及与我的模型相关的django_migrations表,并重新运行上述命令。
请记住:如果您的IDE中有一个以_001结尾的迁移,那么_003在您的数据库中。 Django只会查看是否有以_004结尾的迁移,以便更新任何内容。
2(代码和数据库迁移)是链接在一起工作的。
快乐的编码。
答案 21 :(得分:1)
也许这会对某人有所帮助。
我已删除了models.py
和预期makemigrations
以创建DeleteModel
语句。
请务必删除 *.pyc
文件!
答案 22 :(得分:1)
也许这可以帮助别人,我遇到了同样的问题。
我已经使用序列化程序类和视图创建了两个表。 所以,当我想要更新时,我遇到了这个错误。
我按照以下步骤操作:
.\manage.py makemigrations app
.\manage.py migrate
models.py
1
和2
。models.py
5
。如果您正在使用Pycharm,本地历史记录非常有用。
答案 23 :(得分:1)
我遇到了两次运行makemigrations以及各种奇怪行为的问题。原来问题的根源在于我使用了一个函数在我的模型中设置默认日期,因此每次运行makemigrations时迁移都会检测到更改。这个问题的答案让我走上正轨:Avoid makemigrations to re-create date field
答案 24 :(得分:0)
添加了这个答案,因为以上其他任何一个都不适合我。
在我的情况下发生了更奇怪的事情( Django 1.7版本),在我的 models.py 中我有一个“额外”我文件末尾的行(它是一个空白行),当我执行python manage.py makemigrations
命令时,结果为:“未检测到任何更改”。
要解决此问题,我删除了 models.py 文件末尾的“空白行”,我确实再次运行了命令,一切都已修复,检测到对 models.py 所做的所有更改!
答案 25 :(得分:0)
您可能需要使用以下命令伪造初始迁移
python manage.py migrate --fake-initial
答案 26 :(得分:0)
首先,此解决方案适用于在heroku服务器上部署期间遇到相同问题的人,而我也面临相同的问题。
要进行部署,有一个强制性步骤是在settings.py文件中添加django_heroku.settings(locals())。
更改: 当我将以上行更改为django_heroku.settings(locals(),database = False)时,它可以完美地工作。
答案 27 :(得分:0)
我遇到过这个问题,命令
python manage.py makemigrations
在我保存对文件所做的更改后与我一起工作。
答案 28 :(得分:-1)
添加我的2c,因为这些解决方案都不适合我,但这确实......
我刚刚运行manage.py squashmigrations
并删除了旧的迁移(django.migrations数据库表中的文件和行)。
这在上一个迁移文件中留下了这样的一行:
replaces = [(b'my_app', '0006_auto_20170713_1735'), (b'my_app', '0007_auto_20170713_2003'), (b'my_app', '0008_auto_20170713_2004')]
这显然混淆了Django并导致了奇怪的行为:运行manage.py makemigrations my_app
会重新创建初始迁移,就好像不存在一样。删除replaces...
行可解决问题!
答案 29 :(得分:-1)
python manage.py makemigrations帐户 迁移“帐户”: 帐户\ migrations \ 0001_initial.py -创建模型客户 -创建模型标签 -创建模型产品 -创建模型订单
注意:这里“帐户”是我的应用名称