python - 运行 Django 单元测试会导致南迁移重复表

标签 python django django-south django-unittest

如何防止 Django 单元测试运行南迁移?

我有一个自定义 Django 应用程序 myapp,我正在尝试使用 manage.py test myapp 进行测试,但是当我运行它时,出现错误:

django.db.utils.OperationalError: table "myapp_mymodel" already exists

果然,回溯显示 South 正在被处决:

File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/south/management/commands/test.py", line 8, in handle
super(Command, self).handle(*args, **kwargs)

但是,在我的设置中,我指定了:

SOUTH_TESTS_MIGRATE = 0
SKIP_SOUTH_TESTS = 1

我相信这应该会阻止 Django 的测试框架执行任何 South 组件。

我做错了什么?

编辑:我通过简单地删除南边来解决这个问题:

if 'test' in sys.argv:
    INSTALLED_APPS.remove('south')

但是,然后我得到了:

ImproperlyConfigured: settings.DATABASES is improperly configured. Please supply the NAME value.

对于我的测试数据库设置,我使用:

DATABASES = {
    'default':{
        'ENGINE': 'django.db.backends.sqlite3'
    }
}

在 Django 1.4 中运行良好。现在我正在使用 Django 1.5,我想这不太好。但是,我认为没有 NAME 值可以修复它。他们都报告我的 table 不存在。我试过:

DATABASES = {
    'default':{
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': '/dev/shm/test.db',
        'TEST_NAME': '/dev/shm/test.db',
    }
}


DATABASES = {
    'default':{
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': ':memory:',
        'TEST_NAME': ':memory:',
    }
}

DATABASES = {
    'default':{
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(os.path.dirname(__file__), 'test.db'),
        'TEST_NAME': os.path.join(os.path.dirname(__file__), 'test.db'),
    }
}

每个似乎都创建了一个物理 test.db 文件,我不明白,因为单元测试应该在内存中运行。它不应该将任何内容保存到磁盘上。据推测,在创建文件之后但在执行实际的单元测试之前,它无法运行syncdb。我该如何解决这个问题?

编辑:我发现,在我的一个表单中,我通过直接查询模型来填充字段选择(而我应该在表单的 init 内执行此操作),因此当 Django 的测试时框架导入了我的模型,它试图在创建 sqlite3 数据库之前读取表。我修复了这个问题,但现在出现错误:

DatabaseError: table "myapp_mythroughmodel" already exists

所以我回到了第一点,尽管它抛出了与最初不同的异常类型。

编辑:我定义了一个重复的直通模型,导致 Django 尝试创建它两次,从而导致错误。

最佳答案

这也发生在我的遗留代码上,但出于另一个原因。

我有两个模型,其中 db_table 引用同一个数据库表。 我知道这很愚蠢,但这不是我的错)

我从未在互联网上找到任何可以帮助我的东西。 我被详细程度设置为 3 (manage.py test -v 3) 救了 希望这对任何人都有帮助。

class Bla1(Model):
    some_column = ...
    class Meta:
        db_table = 'some_table'

class Bla2(Model):
    some_column = ...
    class Meta:
        db_table = 'some_table'

关于python - 运行 Django 单元测试会导致南迁移重复表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23408284/

相关文章:

django - 用于 Google App Engine 和 Django 的 python 调试器

python - Django - South - 有没有办法查看它运行的 SQL?

javascript - 从 javascript 调用本地 python 脚本

Python 元类为类生成正确的枚举值

django 一旦切片就无法组合查询

django - 如何从其他处理过的模板中组合一个模板?

django - 在 EC2 上以几乎零停机时间部署(单节点)Django Web 应用程序

python - 为什么south要用迁移文件呢?

python - 线性模型不支持将字符串转换为 float

Python 将 Excel 转换为 CSV