我有一个非常基本的Django应用程序(Python 3.6.4),我已经编写了一个本地传递的单元测试。内存中SQLite DB(默认情况下)为测试创建。当我的Travis CI构建运行相同的测试时,测试通过但测试命令失败并出现以下错误:
File "/home/travis/virtualenv/python3.6.5/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py", line 301, in execute
return Database.Cursor.execute(self, query)
django.db.utils.OperationalError: near "SCHEMA": syntax error
The command "python manage.py test --settings=myapp.dev_settings" exited with 1.
我注意到一个奇怪的事情是,当测试在Travis上运行时,它说它重用现有数据库并且在测试运行后从不销毁它:
$ python manage.py test --settings=myapp.dev_settings
将现有测试数据库用于别名'默认' ...
我真的没有,因为它应该是内存数据库,当我在本地运行它时,每次都会创建一个新的数据库:
Creating test database for alias 'default'...
. . .
Destroying test database for alias 'default'...
我的dev_settings.py
文件在文件系统上有一个sqlite db,但它仅用于运行本地开发服务器:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
Travis会安装所有依赖项,并且它们与我的本地环境相匹配(我非常肯定)。
任何帮助都会很棒,我在这里肯定会遗漏一些明显的东西!!!
答案 0 :(得分:1)
@LaSmell是正确的(我有同样的问题)。这是因为您试图访问构建中的Heroku依赖项。
但是我仍然可以向您展示如何实施解决方案。
您需要做三件事才能解决此问题。
1-指定不带django-heroku的新需求文档
我亲自制作了另一个文件,名为requirements-build.txt,除了 django-heroku == 0.3.1
以外,它具有所有相同的依赖项。我只是将其删除。
2-在.travis.yml
中指定新的需求文件在.travis.yml文件中,只需替换
install:
- pip install -r requirements.txt
使用
install:
- pip install -r requirements-build.txt
3-在您的settings.py文件中说明这些更改
要确保未导入heroku-django,请确保是否可以首先导入它。我做到了:
# Try to import django-heroku depending on Travis or Heroku
try:
# Configure Django App for Heroku.
import django_heroku
django_heroku.settings(locals())
except ImportError:
found = False
这样,如果已安装,它将仅使用django-heroku。由于默认情况下,Heroku使用requirements.txt,因此此补丁可以正常运行。
希望这会有所帮助!我花了一段时间才自己搞定。
答案 1 :(得分:1)
这是因为Django-Heroku软件包设置了自己的Test Runner,如果它检测到CI环境,则可以对数据库进行额外的处理,大概是为了迎合其Heroku CI产品:
# Enable test runner if found in CI environment.
if 'CI' in os.environ:
config['TEST_RUNNER'] = 'django_heroku.HerokuDiscoverRunner'
测试运行程序执行以下操作,该操作不适用于SQLite:
with connection.cursor() as cursor:
cursor.execute(
"""
DROP SCHEMA public CASCADE;
CREATE SCHEMA public;
GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO public;
COMMENT ON SCHEMA public IS 'standard public schema';
"""
)
不幸的是,此检查还检测到非Heroku CI环境(例如Travis或GitLab CI),并尝试使用上述配置。
您可以通过在settings.py
中禁用Heroku测试运行程序来解决此问题:
# Configure Django App for Heroku.
django_heroku.settings(locals(), test_runner=False)
答案 2 :(得分:0)
在travis构建的堆栈跟踪中,我注意到正在执行的意外包:
File "/home/travis/virtualenv/python3.6.5/lib/python3.6/site-packages/django_heroku/core.py", line 41, in teardown_databases
self._wipe_tables(connection)
问题是我正在使用包含Heroku(部署)特定代码的settings.py文件执行我的测试:
import django_heroku
import dj_database_url
# Parse database configuration from Heroku's $DATABASE_URL (Postgres)
DATABASES = {
'default': dj_database_url.config(conn_max_age=500, ssl_require=True)
}
# Activate Django-Heroku (DATABASE_URL and all that).
django_heroku.settings(locals())
我的requirements.txt文件中的依赖项:
django-heroku==0.3.1
一旦我从Travis构建配置中删除了所有Heroku配置,构建就会通过!
仍然不确定我是如何在本地看到这种失败的。