南迁移错误:django.contrib.auth 的 NoMigrations 异常
Posted
技术标签:
【中文标题】南迁移错误:django.contrib.auth 的 NoMigrations 异常【英文标题】:South migration error: NoMigrations exception for django.contrib.auth 【发布时间】:2011-02-20 04:51:03 【问题描述】:我在我的项目中使用 South 已经有一段时间了,但我最近做了大量的开发并更换了开发机器,我认为在这个过程中出现了一些问题。该项目运行良好,但我无法应用迁移。每当我尝试应用迁移时,我都会得到以下回溯:
danpalmer:pest Dan$ python manage.py migrate frontend
Traceback (most recent call last):
File "manage.py", line 11, in <module>
execute_manager(settings)
File "/Library/Python/2.6/site-packages/django/core/management/__init__.py", line 362, in execute_manager
utility.execute()
File "/Library/Python/2.6/site-packages/django/core/management/__init__.py", line 303, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/Library/Python/2.6/site-packages/django/core/management/base.py", line 195, in run_from_argv
self.execute(*args, **options.__dict__)
File "/Library/Python/2.6/site-packages/django/core/management/base.py", line 222, in execute
output = self.handle(*args, **options)
File "/Library/Python/2.6/site-packages/South-0.7-py2.6.egg/south/management/commands/migrate.py", line 102, in handle
delete_ghosts = delete_ghosts,
File "/Library/Python/2.6/site-packages/South-0.7-py2.6.egg/south/migration/__init__.py", line 182, in migrate_app
applied = check_migration_histories(applied, delete_ghosts)
File "/Library/Python/2.6/site-packages/South-0.7-py2.6.egg/south/migration/__init__.py", line 85, in check_migration_histories
m = h.get_migration()
File "/Library/Python/2.6/site-packages/South-0.7-py2.6.egg/south/models.py", line 34, in get_migration
return self.get_migrations().migration(self.migration)
File "/Library/Python/2.6/site-packages/South-0.7-py2.6.egg/south/models.py", line 31, in get_migrations
return Migrations(self.app_name)
File "/Library/Python/2.6/site-packages/South-0.7-py2.6.egg/south/migration/base.py", line 60, in __call__
self.instances[app_label] = super(MigrationsMetaclass, self).__call__(app_label_to_app_module(app_label), **kwds)
File "/Library/Python/2.6/site-packages/South-0.7-py2.6.egg/south/migration/base.py", line 88, in __init__
self.set_application(application, force_creation, verbose_creation)
File "/Library/Python/2.6/site-packages/South-0.7-py2.6.egg/south/migration/base.py", line 159, in set_application
raise exceptions.NoMigrations(application)
south.exceptions.NoMigrations: Application '<module 'django.contrib.auth' from '/Library/Python/2.6/site-packages/django/contrib/auth/__init__.pyc'>' has no migrations.
我对 South 没有那么丰富的经验,以前也没有遇到过这个错误。我可以在网上找到关于这个错误的唯一有用的提示是我认为是 pre-0.7 并且我在 South 0.7。我运行了“easy_install -U South”以确保。
【问题讨论】:
您是否先同步db 以确保Southmigrationhistory 表存在?还是您在移动机器时导入了数据库转储? 另外,django.contrib.auth 不应该使用迁移(除非你自己动手破解它)。您是否为 contrib.auth 手动创建了迁移目录? 我首先做了一个同步数据库。该数据库与我只是使用 SQLite 数据库进行开发的数据库相同。对于第二点,请参阅下面的解决方案。taggit
应用程序遇到了同样的异常。但是当我使用另一台服务器的数据库转储时发生了这种情况:服务器的版本为 0.11.2,而我的版本为旧的 0.9.3。在pip install -U django-taggit
之后问题就消失了。
【参考方案1】:
我解决了这个问题。
显然,您不能使用 South 来迁移属于 Django 的应用程序,例如“auth”,所以我不知道它为什么要这样做。
我意识到有一段时间我的项目中有另一个名为 auth 的应用程序。我一定是在重命名之前尝试过迁移它,因此把它搞砸了。
我从该应用程序的数据库中删除了迁移历史条目,一切都很好。
【讨论】:
今天和消息应用遇到了同样的问题。 您可以将 South 用于 Django 中的应用程序,例如 auth,它有时确实有意义。请看下面我的回答。我不确定当接受的答案不正确时该怎么办,也许您可以编辑您的答案以包含我的正确答案?【参考方案2】:这里留给未来的谷歌员工
我最近在我自己的一个应用程序中遇到了这个异常,而不是贡献者。
经过一番摸索后,我注意到文件以某种方式...
app/migrations/__init__.py
...已被删除,这意味着python无法将目录导入为模块等。
【讨论】:
谢谢,它也帮助了我。 对我来说,注册迁移到数据库和删除migrations
目录之间存在不连贯的状态。添加migrations
及其__init__.py
解决了这个问题。
我的情况正好相反。我删除了*.py
迁移文件,只留下了*.pyc
版本。 South 或 Django 1.7+ 迁移框架无法识别 *.pyc
迁移文件。另外,检查 Django 设置模块中的MIGRATION_MODULES
设置。【参考方案3】:
我也遇到了同样的问题,但是这发生在根应用程序上。我发现这是由于早期开发的项目根目录中有一个空的models.py
。我怀疑这个问题也可能出现在项目申请中。
【讨论】:
【参考方案4】:您可以在内置模块上进行迁移,这对于数据迁移绝对有意义,例如,截断所有用户名、删除无效电子邮件等。
对于来自 django.contrib.auth.models 的用户,只需使用:orm['auth.User']
【讨论】:
【参考方案5】:我也遇到了同样的问题,最后我通过从 south_migrationhistory 表中删除所有行并从终端运行以下命令来解决此问题。
python manage.py reset south
这个answer解释了如何重置南迁历史。
编辑:
从 Django 1.5 开始,reset
命令将不起作用。相反,您必须使用flush
。
python manage.py flush
要了解更多关于flush会做什么的信息,请阅读*** answer。
【讨论】:
请注意,在 Django 1.5 中,“reset”命令已替换为“flush”,尽管 flush 不适用于单个表。为此,您需要使用旧重置的此端口:github.com/gregmuellegger/django-reset【参考方案6】:我遇到了同样的错误,但不是针对 django 模块,而是针对作为我的 virtualenv 一部分的模块。我不知道南如何为该模块进行迁移,因为它确实没有任何迁移。然后我记得我从一个应该是相同的测试环境中复制了数据库。但事实证明,另一个 env 的模块版本略有不同,确实进行了迁移。 我最终从南迁移历史中删除了有问题的行(因为无论如何它是一个测试环境)。
【讨论】:
【参考方案7】:我只是在切换分支和应用程序版本后遇到了这个问题,并决定从 south_migrationhistory 表中删除现在没有迁移的应用程序
./manage.py dbshell
mysql> SELECT * FROM south_migrationhistory WHERE app_name = 'social_auth';
104 | social_auth | 0001_initial...
105 | social_auth | 0002_auto__add_unique_nonce...
mysql> DELETE FROM south_migrationhistory WHERE app_name = 'social_auth';
Query OK, 2 rows affected (0.00 sec)
【讨论】:
当您只想删除单个应用程序迁移而不是重置/刷新所有南方时,这也是一个快速修复。 太棒了,这解决了我的问题,虽然我不是 OP 嘿嘿欢呼【参考方案8】:django.contrib.admin 遇到了类似的问题,不允许我运行迁移。我通过在 settings.INSTALLED_APPS 中禁用 django.contrib.admin 解决了这个问题
【讨论】:
以上是关于南迁移错误:django.contrib.auth 的 NoMigrations 异常的主要内容,如果未能解决你的问题,请参考以下文章
渲染时 NoReverseMatch:“django.contrib.auth.views.login”的反向
AttributeError:模块 Django.contrib.auth.views 没有属性
类型错误:字段 'id' 需要一个数字,但得到 <django.contrib.auth.models.AnonymousUser object at 0x048C7E90>