如何防止 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/