【问题标题】:South migration error: NoMigrations exception for django.contrib.auth南迁移错误:django.contrib.auth 的 NoMigrations 异常
【发布时间】: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 之后问题就消失了。

标签: database django migration django-south


【解决方案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会做什么的信息,请阅读stackoverflow 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 解决了这个问题

        【讨论】:

          猜你喜欢
          • 2020-10-06
          • 2013-05-20
          • 2011-11-19
          • 2021-11-13
          • 2019-09-06
          • 2014-03-21
          • 2014-06-26
          • 2013-02-04
          • 2013-02-09
          相关资源
          最近更新 更多