【问题标题】:factory_boy UserFactory: no such table: auth_userfactory_boy UserFactory:没有这样的表:auth_user
【发布时间】:2014-10-07 20:15:41
【问题描述】:

我正在尝试创建UserFactory,运行./manage.py test 时出现此错误:

OperationalError: no such table: auth_user

这是我的factories.py 文件的样子:

import factory
import django.contrib.auth.models as auth_models
from wacep.weatherroulette.models import (
    GameState, Puzzle
)


class UserFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = auth_models.User

    username = factory.Sequence(lambda n: "user_%d" % n)


class PuzzleFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = Puzzle

    display_name = factory.Sequence(lambda n: 'Test Puzzle {0}'.format(n))
    description = factory.Sequence(lambda n: 'Description {0}'.format(n))


class GameStateFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = GameState

    user = UserFactory()
    current_inventory = 300

有人知道这里发生了什么吗?

【问题讨论】:

    标签: python django nose factory-boy


    【解决方案1】:

    哦.. 从factory.Factory 继承而不是factory.django.DjangoModelFactory 似乎可以修复错误。

    【讨论】:

      【解决方案2】:

      实际上,发生错误是因为django.contrib.auth 不是您的settings.INSTALLED_APPS 的一部分。

      当factory_boy 尝试创建django.contrib.auth.models.User 并且在数据库中找不到相关表时,就会出现您看到的错误。

      该表应该在测试开始时由 Django 的测试运行程序自动创建;它没有被创建的事实意味着您没有将django.contrib.auth 添加到您的INSTALLED_APPS。

      【讨论】:

      • 我的settings.INSTALLED_APPS 中确实有django.contrib.auth -- 这不是问题。
      【解决方案3】:

      我实际上遇到了这个问题,因为我自己也遇到了同样的问题,经过一番研究,我想我知道问题出在哪里。您可能已经猜到了,它与这一行有关:

      user = UserFactory()
      

      您在此处实际执行的操作将尝试在未正确使用 Django ORM 的情况下创建 User 对象。作为旁注:我还没有完全解析这里出了什么问题——它要么在设置测试数据库之前尝试在导入期间创建一个用户对象,要么它实际上没有与适当的数据库通信。至少结果是它需要一点 Django 魔法来创建你的对象。 factory_boy 提供了这种魔力。

      将此行更改为:

      user = UserFactory.create()
      

      应该修正你的错误。

      【讨论】:

        【解决方案4】:

        这确实是一个迟到的答案,但是我今天遇到了这个问题并想分享我的解决方案。

        使用 django,我的开发设置 settings.local 使用 Postgresql,但测试设置 settings.test 使用 sqlite3。在settings.test 下运行测试导致no such table 错误,如下所示。

        $ DJANGO_SETTINGS_MODULE=myproject.settings.test python manage.py test
        OperationalError: no such table: ...
        

        这似乎是因为 sqlite3 数据库没有架构,因为我从未使用 sqlite3 进行开发。所以我migrate for sqlite

        $ DJANGO_SETTINGS_MODULE=myproject.settings.test python manage.py migrate
        # ... migration running for sqlite3 ...
        

        迁移完成后,我可以按预期使用 sqlite3 测试数据库运行测试。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-12-28
          • 2019-03-25
          • 2017-05-03
          • 2017-07-06
          • 2014-09-01
          • 1970-01-01
          • 2014-01-06
          相关资源
          最近更新 更多