Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django忽略测试数据库设置_Python_Django - Fatal编程技术网

Python Django忽略测试数据库设置

Python Django忽略测试数据库设置,python,django,Python,Django,我在Pythonywhere上部署了一个运行良好的应用程序。问题是,当我想要运行TestDjango时,我的测试数据库设置被完全忽略。 每次运行测试时,我都会收到以下消息 Creating test database for alias 'default'... Got an error creating the test

我在Pythonywhere上部署了一个运行良好的应用程序。问题是,当我想要运行TestDjango时,我的测试数据库设置被完全忽略。 每次运行测试时,我都会收到以下消息

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',
            }
        }