Python Django忽略测试数据库设置
我在Pythonywhere上部署了一个运行良好的应用程序。问题是,当我想要运行TestDjango时,我的测试数据库设置被完全忽略。 每次运行测试时,我都会收到以下消息Python Django忽略测试数据库设置,python,django,Python,Django,我在Pythonywhere上部署了一个运行良好的应用程序。问题是,当我想要运行TestDjango时,我的测试数据库设置被完全忽略。 每次运行测试时,我都会收到以下消息 Creating test database for alias 'default'... Got an error creating the test
Creating test database for alias 'default'...
Got an error creating the test database: (1044, "Access denied for user 'funnshopp'@'%' to database 'test_funnshopp$funn'")
应用程序的数据库名称为funnshop$funn
。可以看出,django总是以某种方式尝试通过在数据库名称后面附加test\uu
来创建测试数据库。不管我在数据库中有什么设置
下面是我的完整设置文件(测试在我的电脑上运行正常,我使用的是Django 2.0
,尽管我是从Django 1.11
开始的项目)
下面是pip冻结的结果
alabaster==0.7.10
Babel==2.5.1
beautifulsoup4==4.6.0
certifi==2017.11.5
chardet==3.0.4
colorama==0.3.9
coverage==4.4.2
dj-database-url==0.4.2
dj-static==0.0.6
Django==2.0.1
django-addanother==2.0.0
django-archive==0.1.5
django-braces==1.12.0
django-debug-toolbar==1.9.1
django-extensions==1.9.9
django-guardian==1.4.9
django-heroku==0.2.0
django-pure-pagination==0.3.0
django-recaptcha==1.3.1
django-toolbelt==0.0.1
django-webtest==1.9.2
docutils==0.14
funcsigs==1.0.2
gunicorn==19.7.1
idna==2.6
我认为您应该更改设置的格式。py,您不能将if条件放入其中,而是根据您所处的环境使用不同的设置
我建议你读一下这个
当您拥有正确的布局时,您可以在不同的设置文件中更改数据库;) 这是一种常见且正确的行为。Django在测试时将始终尝试创建新数据库,并且您不应该尝试在实时/生产数据库上测试您的应用程序
您的测试应该以这样的方式构建,即您创建对象,然后测试它们的行为。您在heroku上使用postgres,在development server上使用mysql。如果你想使用这个数据库来测试你的应用程序,你必须将django用户添加到你的postgres/mysql中,并拥有创建和删除数据库/表的权限
您还可以通过将此设置添加到settings.py中来避免这种情况(当我不使用任何其他扩展时,我喜欢这样做,sqlite3数据库就足够了。我通过键入python manage.py test
if any([arg in sys.argv for arg in ['jenkins', 'test']]):
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'mydatabase',
}
}
我根据这里建议的模式重新组织了设置文件,解决了这个问题
现在我的测试在Python上运行良好
顺便说一句,我在这里创建了一个数据库,它处理虚拟环境和布局的问题以及如何处理虚拟环境变量。正如您所知,当您运行测试时,Django会隔离对数据库所做的更改。这就是为什么它会尝试创建一个数据库,但数据库引擎拒绝它。您可以:
创建数据库,授予用户访问权限,并使用--keepdb
运行测试
或授予DB用户创建数据库的访问权限。类似于:
ALTER USER username CREATEDB;
如果你能仔细准备好我的答案,我想你会找到所有需要的答案:)通常,@mic4ael,有人会提出类似于“如何最好地利用圣诞布丁敲入钉子”的问题。这个问题的答案可能是“烘烤它直到它变硬”,但更好的答案是“使用锤子”。在这种情况下,sebb以第二种方式回答,因为他是正确的-不应该对生产数据库运行测试。这在Django版本2.0.1中失败了吗?如果您尝试使用TEST\u NAME
键,而不是像文档中的本例那样使用TEST
字典,会怎么样TEST_NAME
适用于较旧的版本。是的,这就是为什么我问您使用的是什么版本2.0.1,您可以从我的“pip freeze”输出中看到这一点。我将阅读教程并实现such@Parousia乐于助人,如果有用,请将答案标记为正确;)
if any([arg in sys.argv for arg in ['jenkins', 'test']]):
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'mydatabase',
}
}