正如标题所说,我似乎无法让迁移工作。
该应用程序最初低于 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 数据库。
如果您要从您在 django 1.6 中制作的现有应用程序进行更改,那么您需要执行文档中列出的一个前置步骤(正如我发现的那样):
python manage.py makemigrations your_app_label
该文档并未明确表明您需要将应用标签添加到命令中,因为它告诉您做的第一件事是 python manage.py makemigrations
这将失败。当您在 1.7 版本中创建应用程序时,初始迁移已完成,但如果您来自 1.6,则不会执行。有关更多详细信息,请参阅文档中的 'Adding migration to apps'。
这可能是由于以下原因造成的:
您没有在 settings.py 的 INSTALLED_APPS 列表中添加应用程序(您必须在应用程序文件夹的 apps.py 中添加应用程序名称或虚线路径到 AppConfig 的子类,具体取决于您使用的 django 版本) .参考文档:INSTALLED_APPS 这些应用程序中没有迁移文件夹。 (解决方案:只需创建该文件夹)。这些应用程序的迁移文件夹中没有 __init__.py 文件。 (解决方案:只需创建一个名为 init.py 的空文件)您的 app 文件夹中没有 __init__.py 文件。 (解决方法:只需创建一个名为__init__.py的空文件)您的应用程序中没有models.py文件models.py中的Python类(应该是模型)不继承django.db.models .Model 你在models.py中定义模型时有一些语义错误
注意: 一个常见的错误是在 .gitignore
文件中添加 migrations
文件夹。从远程存储库克隆时,本地存储库中将缺少 migrations
文件夹和/或 __init__.py
文件。这会导致问题。
迁移文件应该包含在 repo 中。 read here。如果您的团队经常遇到迁移问题,您可以考虑忽略迁移文件,如下所示:
我建议通过将以下行添加到 .gitignore
文件来 gitignore 迁移文件
*/migrations/*
!*/migrations/__init__.py
请记住,不建议按照 django 文档 gitignore 迁移文件
__init__.py
文件夹以及迁移。
You don't have __init__.py file inside migrations folder of those apps. (Solution: Just create an empty file with name __init__.py)
.. 它是由将文件添加到 .gitignore
引起的
__init__.py
文件需要在目录中才能将其视为 python 包。 see this
好的,看起来我错过了一个明显的步骤,但发布这个以防其他人也这样做。
升级到 1.7 时,我的模型变得不受管理 (managed = False
) - 我之前将它们作为 True
,但似乎它已恢复。
删除该行(默认为 True)然后运行 makemigrations
立即创建了一个迁移模块,现在它正在工作。 makemigrations
不适用于非托管表(事后看来很明显)
manage.py inspectdb
添加了 manage=False!如果您导入遗留数据库,您必须仔细调整它!
app_label
相同
我的解决方案未在此处介绍,因此我将其发布。我一直在将 syncdb
用于一个项目——只是为了启动和运行它。然后,当我尝试开始使用 Django 迁移时,它首先伪造了它们,然后会说它是“好的”,但数据库没有发生任何事情。
我的解决方案是删除我的应用程序的所有迁移文件,以及作为 django_migrations
表中应用程序迁移的数据库记录。
然后我只是做了一个初始迁移:
./manage.py makemigrations my_app
其次是:
./manage.py migrate my_app
现在我可以毫无问题地进行迁移。
__init.py__
,它不会工作。
同意@furins。如果一切似乎都井井有条,但出现了这个问题,请检查是否有任何属性方法与您尝试在 Model 类中添加的属性具有相同的标题。
删除名称与您要添加的属性相似的方法。 manage.py makemigrations my_app manage.py migrate my_app 添加方法。
这是一个愚蠢的错误,但是在模型类的字段声明行末尾有一个额外的逗号,会使该行无效。
当您复制粘贴def时会发生这种情况。来自迁移,它本身被定义为一个数组。
虽然也许这会对某人有所帮助:-)
也许我来得太晚了,但您是否尝试在您的应用程序中有一个 migrations
文件夹,其中包含一个 __init__.py
文件?
也许这会对某人有所帮助。我正在使用嵌套应用程序。 project.appname 和我实际上在 INSTALLED_APPS 中有 project 和 project.appname。从 INSTALLED_APPS 中删除项目允许检测到更改。
答案在 cdvv7788 Migrations in Django 1.7 的这篇 stackoverflow 帖子上
如果这是您第一次迁移您必须使用的应用程序:manage.py makemigrations myappname 一旦您这样做了,您可以这样做:manage.py migrate 如果您的应用程序在数据库中,修改了它的模型并且它没有更新更改在 makemigrations 你可能还没有迁移它。将您的模型改回其原始形式,运行第一个命令(使用应用程序名称)并迁移......它会伪造它。完成后,将更改恢复到模型上,运行 makemigrations 并再次迁移,它应该可以工作。
我遇到了完全相同的麻烦,并且上述操作完美无缺。
我已将 django 应用程序移至 cloud9,但由于某种原因,我从未进行过初始迁移。
以下为我工作:
将应用名称添加到 settings.py 使用 'python manage.py makemigrations' 使用 'python manage.py migrate'
为我工作:Python 3.4、Django 1.10
像我这样不喜欢迁移的人可以使用以下步骤。
删除您要同步的更改。运行 python manage.py makemigrations app_label 进行初始迁移。在进行更改之前运行 python manage.py migrate 以创建表。粘贴您在第一步中删除的更改。运行 2. 和 3. 步骤。
如果您混淆了这些步骤中的任何一个,请阅读迁移文件。更改它们以更正您的架构或删除不需要的文件,但不要忘记更改下一个迁移文件的依赖项部分;)
我希望这对将来的人有所帮助。
您要检查 INSTALLED_APPS
列表中的 settings.py
并确保其中列出了所有具有模型的应用程序。
在项目文件夹中运行 makemigrations
意味着它将更新与项目 settings.py
中包含的所有应用程序相关的所有表。包含它后,makemigrations
将自动包含该应用程序(这样可以节省大量工作,因此您不必为项目/站点中的每个应用程序运行 makemigrations app_name
)。
以防万一您有一个未由 makemigrations 识别的特定字段:检查您是否有同名的属性。
例子:
field = django.db.models.CharField(max_length=10, default = '', blank=True, null=True)
# ... later
@property
def field(self):
pass
该属性将“覆盖”字段定义,因此 makemigrations
不会识别更改
hourly_rate = models.DecimalField
(缺少尾随的 '()'),它只是默默地失败了。
添加这个答案是因为只有这种方法对我有帮助。
我删除了 migrations
文件夹运行 makemigrations
和 migrate
。
它仍然说:没有要应用的迁移。
我去了 migrate
文件夹并打开了最后创建的文件,
注释我想要的迁移(它被检测到并在那里输入)
并再次运行 migrate
。
这基本上是手动编辑迁移文件。仅当您了解文件内容时才执行此操作。
确保您的模型不是 abstract
。我实际上犯了这个错误,并且花了一段时间,所以我想我会发布它。
您在重命名旧迁移文件夹后是否使用了 schemamigration my_app --initial
?试试看。可能会奏效。如果没有 - 尝试重新创建数据库并进行同步数据库迁移。它对我有用...
schemamigration
- 我认为这是 South 的一部分?我目前根本没有迁移文件夹。删除我的 models.py
并重新运行 inspectdb
似乎没有任何作用。
schemamigration
来自南方。 makemigrations
是它的替代品。
makemigrations --empty
就我而言,我需要将模型添加到定义模型的模型文件夹的 _init_.py 文件中:
from myapp.models.mymodel import MyModel
有同样的问题确保你在models.py中定义的任何类,你必须继承models.Model类。
class Product(models.Model):
title = models.TextField()
description = models.TextField()
price = models.TextField()
我从我的项目目录中错误地删除了 migrations
文件夹。
解决方案是在 migrations
文件夹中创建 __init__.py
文件,然后,
python manage.py makemigrations
python manage.py migrate
我遇到了同样的问题,不得不两次运行 makemigrations 以及各种奇怪的行为。事实证明,问题的根源在于我使用了一个函数来在我的模型中设置默认日期,所以每次我运行 makemigrations 时,迁移都会检测到变化。这个问题的答案让我走上了正轨:Avoid makemigrations to re-create date field
我最近将 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,然后执行 {2 }。这就像一个魅力。一旦为所有应用创建了初始迁移并进行了假初始迁移,然后添加新模型并遵循 makemigrations
的常规过程并在该应用上迁移。现在检测到更改,一切正常。
我只是想在这里分享它,如果有人遇到同样的问题(他们的应用程序有南 schemamigrations
),它可能会帮助他们:)
也许这可以帮助某人,我有同样的问题。
我已经使用序列化程序类和视图创建了两个表。所以当我想更新时,我遇到了这个错误。
我按照以下步骤操作:
我制作了 .\manage.py makemigrations 应用程序我执行了 .\manage.py 迁移我删除了我的模型的两个表。py 我从序列化程序和视图类中删除了对我的表的所有引用。我执行了第 1 步和第 2 步。我在再次执行第 5 步的 models.py 中检索了我的更改。我恢复了所有更改。
如果您正在使用 Pycharm,本地历史非常有帮助。
也许这会对某人有所帮助。
我删除了我的 models.py
并希望 makemigrations
创建 DeleteModel
语句。
记得删除 *.pyc
个文件!
./manage makemigrations
./manage migrate
迁移跟踪对数据库的更改,因此如果您从非托管更改为托管,您需要确保您的数据库表与您正在处理的模型相关是最新的。
如果您仍处于开发模式,我个人决定删除我的 IDE 以及与我的模型相关的 django_migrations 表中的迁移文件,然后重新运行上述命令。
请记住:如果您的迁移以 IDE 中的 _001 和数据库中的 _003 结尾。 Django 只会查看您是否有以 _004 结尾的迁移以进行任何更新。
2(代码和数据库迁移)链接并协同工作。
快乐编码。
您可能需要使用以下命令伪造初始迁移
python manage.py migrate --fake-initial
删除您要同步的更改。运行 python manage.py makemigrations app_label 进行初始迁移。在进行更改之前运行 python manage.py migrate 以创建表。粘贴您在第一步中删除的更改。运行 2. 和 3. 步骤
添加了这个答案,因为上面没有其他可用的对我有用。
就我而言,发生了更奇怪的事情(Django 1.7 版本),在我的 models.py 中,我有一个 "extra" 行我的文件末尾(它是一个空行),当我执行 python manage.py makemigrations
命令时,结果是:“未检测到更改”。
为了解决这个问题,我删除了我的 models.py 文件末尾的这个“空白行”,我再次运行了命令,一切都得到了修复,并且检测到了对 models.py 所做的所有更改!
首先,此解决方案适用于在 heroku 服务器上部署期间遇到相同问题的人,我也遇到了同样的问题。
要部署,有一个强制性步骤是在 settings.py 文件中添加 django_heroku.settings(locals()) 。
更改:当我将上面的行更改为 django_heroku.settings(locals(), databases=False) 时,它完美地工作。
我遇到了这个问题,命令
python manage.py makemigrations
一旦我保存了对文件所做的更改,就和我一起工作。
原因之一可能是您没有在 admin.py 文件中注册模型。首先在 admin.py 文件中注册您的模型,然后进行迁移。
python manage.py makemigrations APP_LABEL
吗?./manage.py startapp
创建的,但我仍然必须明确提及标签