【发布时间】:2020-01-06 10:55:05
【问题描述】:
从 Django 1.8 成功升级到 Django 2.2.4 后,当 我运行测试它失败了,因为 Django 没有创建数据库表。
我的 test_settings.py 文件在升级前工作正常。
调试 Django db/backends 后,看起来连接已创建,但表并未创建。 我怀疑 test_setting.py 没有配置好,尽管我从 setting.py 文件中复制了除了数据库配置(仍然是 SQLite)之外的所有内容。
数据库配置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'test_database'
}
}
INSTALLED_APPS = [
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'rest_framework.authtoken',
'my_app',
'mptt',
'corsheaders',
# audit app
'easyaudit',
'kronos',
'django.contrib.admin',
]
我得到的回溯(例如,这里是 auth_user,但它以相同的方式为所有表重现):
Traceback (most recent call last):
File "C:\Users\owner\Desktop\workspace\my_project\MyProject\services\tests\test_logging.py", line 33, in setUpClass
cls.user = User.objects.get_or_create(username='logging_test_user', password='test_password')
File "C:\Users\owner\Desktop\workspace\my_project\venv36\lib\site-packages\django\db\models\manager.py", line 82, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "C:\Users\owner\Desktop\workspace\my_project\venv36\lib\site-packages\django\db\models\query.py", line 538, in get_or_create
return self.get(**kwargs), False
File "C:\Users\owner\Desktop\workspace\my_project\venv36\lib\site-packages\django\db\models\query.py", line 402, in get
num = len(clone)
File "C:\Users\owner\Desktop\workspace\my_project\venv36\lib\site-packages\django\db\models\query.py", line 256, in __len__
self._fetch_all()
File "C:\Users\owner\Desktop\workspace\my_project\venv36\lib\site-packages\django\db\models\query.py", line 1242, in _fetch_all
self._result_cache = list(self._iterable_class(self))
File "C:\Users\owner\Desktop\workspace\my_project\venv36\lib\site-packages\django\db\models\query.py", line 55, in __iter__
results = compiler.execute_sql(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)
File "C:\Users\owner\Desktop\workspace\my_project\venv36\lib\site-packages\django\db\models\sql\compiler.py", line 1100, in execute_sql
cursor.execute(sql, params)
File "C:\Users\owner\Desktop\workspace\my_project\venv36\lib\site-packages\django\db\backends\utils.py", line 67, in execute
return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
File "C:\Users\owner\Desktop\workspace\my_project\venv36\lib\site-packages\django\db\backends\utils.py", line 76, in _execute_with_wrappers
return executor(sql, params, many, context)
File "C:\Users\owner\Desktop\workspace\my_project\venv36\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "C:\Users\owner\Desktop\workspace\my_project\venv36\lib\site-packages\django\db\utils.py", line 89, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File "C:\Users\owner\Desktop\workspace\my_project\venv36\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "C:\Users\owner\Desktop\workspace\my_project\venv36\lib\site-packages\django\db\backends\sqlite3\base.py", line 383, in execute
return Database.Cursor.execute(self, query, params)
django.db.utils.OperationalError: no such table: auth_user
使用环境变量执行的测试
DJANGO_SETTINGS_MODULE=MyProject.test_settings
【问题讨论】:
-
在运行测试时是否看到“Creating test database for alias 'default'...”?
-
另外,您的开发/生产数据库是什么?为什么不在你的测试中使用相同的东西呢?例如,如果您使用 PostgreSQL 数据库并使用特定的 pg 功能(如
JSONField),您的测试将失败。 -
我在我的环境中看不到它,但在我的同事中,它已显示,但仍然出现相同的错误。我的开发数据库是 PostgreSQL。我们没有使用 JSONField,所以这不是问题。
标签: django django-models django-testing django-settings django-2.2