【问题标题】:Django 1.8 test issue: ProgrammingError: relation "auth_user" does not existDjango 1.8 测试问题:ProgrammingError: 关系“auth_user”不存在
【发布时间】:2018-03-25 09:09:06
【问题描述】:

我最近将 Django 升级到 1.8 并设置了一个新的开发数据库以重新开始。迁移和依赖关系进展顺利,避免了您遇到的常见错误并最终解决了问题。该应用程序现在在本地运行良好。

但是,我在尝试运行测试时遇到错误:

python manage.py test

这是我得到的错误:

django.db.utils.ProgrammingError: relation "auth_user" does not exist

不用说,django的auth模块确实是在app中安装和迁移的,所以不清楚是怎么回事。

这是完整的堆栈跟踪,以防您需要查看它,但它并没有说任何对我找出这个错误的原因有帮助的东西:

Traceback (most recent call last):
  File "C:/Users/dabadaba/PycharmProjects/dogpatchsports_com/mysite/manage_sched_dev.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "C:\Users\dabadaba\Envs\django18\lib\site-packages\django\core\management\__init__.py", line 354, in execute_from_command_line
    utility.execute()
  File "C:\Users\dabadaba\Envs\django18\lib\site-packages\django\core\management\__init__.py", line 346, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "C:\Users\dabadaba\Envs\django18\lib\site-packages\django\core\management\commands\test.py", line 30, in run_from_argv
    super(Command, self).run_from_argv(argv)
  File "C:\Users\dabadaba\Envs\django18\lib\site-packages\django\core\management\base.py", line 394, in run_from_argv
    self.execute(*args, **cmd_options)
  File "C:\Users\dabadaba\Envs\django18\lib\site-packages\django\core\management\commands\test.py", line 74, in execute
    super(Command, self).execute(*args, **options)
  File "C:\Users\dabadaba\Envs\django18\lib\site-packages\django\core\management\base.py", line 445, in execute
    output = self.handle(*args, **options)
  File "C:\Users\dabadaba\Envs\django18\lib\site-packages\django\core\management\commands\test.py", line 90, in handle
    failures = test_runner.run_tests(test_labels)
  File "C:\Users\dabadaba\Envs\django18\lib\site-packages\django\test\runner.py", line 210, in run_tests
    old_config = self.setup_databases()
  File "C:\Users\dabadaba\Envs\django18\lib\site-packages\django\test\runner.py", line 166, in setup_databases
    **kwargs
  File "C:\Users\dabadaba\Envs\django18\lib\site-packages\django\test\runner.py", line 370, in setup_databases
    serialize=connection.settings_dict.get("TEST", {}).get("SERIALIZE", True),
  File "C:\Users\dabadaba\Envs\django18\lib\site-packages\django\db\backends\base\creation.py", line 368, in create_test_db
    test_flush=not keepdb,
  File "C:\Users\dabadaba\Envs\django18\lib\site-packages\django\core\management\__init__.py", line 120, in call_command
    return command.execute(*args, **defaults)
  File "C:\Users\dabadaba\Envs\django18\lib\site-packages\django\core\management\base.py", line 445, in execute
    output = self.handle(*args, **options)
  File "C:\Users\dabadaba\Envs\django18\lib\site-packages\django\core\management\commands\migrate.py", line 179, in handle
    created_models = self.sync_apps(connection, executor.loader.unmigrated_apps)
  File "C:\Users\dabadaba\Envs\django18\lib\site-packages\django\core\management\commands\migrate.py", line 318, in sync_apps
    cursor.execute(statement)
  File "C:\Users\dabadaba\Envs\django18\lib\site-packages\django\db\backends\utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "C:\Users\dabadaba\Envs\django18\lib\site-packages\django\db\utils.py", line 98, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "C:\Users\dabadaba\Envs\django18\lib\site-packages\django\db\backends\utils.py", line 62, in execute
    return self.cursor.execute(sql)
django.db.utils.ProgrammingError: relation "auth_user" does not exist

我可以在this answer 之后找到一种解决方法,它可以防止测试任务运行migrate,根据我一直在阅读的内容,这应该是错误发生的地方。很奇怪,因为当我运行 migrate 时,一切都很好。

但是,我不希望采用厚颜无耻的解决方法,而是坚持按照设计的方式做事。此外,此错误可能暗示其他问题实际上是错误的,应该修复。

一些解决方案建议运行:

python manage.py migrate auth
python manage.py migrate

但这无济于事,因为我的项目中没有待处理的迁移。

我该如何解决这个神秘的问题?

【问题讨论】:

    标签: python django migration django-1.8


    【解决方案1】:

    我遇到了同样的问题,当我迁移了项目中包含的其中一个应用程序时,它终于解决了,但迁移过程没有自动执行。

    所以只需检查您的应用程序,然后手动执行./manage.py makemigrations YOUR_APP_NAME 和./manage.py migrate。

    【讨论】:

      【解决方案2】:

      如果您有任何应用程序具有指向 auth.User 的外键,请确保这些应用程序的初始迁移在身份验证应用程序上具有 dependency:

      class Migration(migrations.Migration):
      
          dependencies = [('auth', '__first__')]
      

      【讨论】:

      • 好吧,他们显然有这种依赖关系migrations.swappable_dependency(settings.AUTH_USER_MODEL)
      • 你有自定义用户模型吗?
      • afaik 我们正在使用 Django 的本地用户。但这是我刚刚发现的东西,你觉得这很奇怪吗?:这是我们的一个模型中的一个属性:admins = models.ManyToManyField('auth.User')。然后从外壳中,我从数据库中获取该模型的实例,并打印instance.admins.first() 的类型,它输出我期望的django.contrib.auth.models.User。那么属性怎么定义为auth.User呢?也许这是我们的 Django 升级带来的错误?但是,迁移最初是如何发挥作用的呢?你看到这里有什么奇怪的地方吗?
      • '&lt;app&gt;.&lt;model&gt;' 没问题 - 请参阅文档中的示例 'production.Manufacturer'。对用户模型的建议是使用settings.AUTH_USER_MODEL 使其更可重用,但这不是这里的问题,'auth.User' 就可以了。
      • 所以基本上auth.User 与django.contrib.auth.models.User 相同?那为什么会出现我的问题?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-04
      • 2016-04-11
      • 2016-10-01
      • 2015-08-12
      • 1970-01-01
      • 2018-10-25
      相关资源
      最近更新 更多