Django 测试错误“创建数据库的权限被拒绝” - 使用 Heroku Postgres

Posted

技术标签:

【中文标题】Django 测试错误“创建数据库的权限被拒绝” - 使用 Heroku Postgres【英文标题】:Django Test Error "Permission denied to create database" - Using Heroku Postgres 【发布时间】:2014-03-25 13:44:34 【问题描述】:

我正在尝试使用 Django App 目录 (mysite/polls/tests.py) 中的 tests.py 文件进行简单的 Django 测试,但是每次运行“python manage.py test polls”时,我都会得到错误:

C:\Python27\python.exe "C:\Program Files (x86)\JetBrains\PyCharm 3.0\helpers\pycharm\django_test_manage.py" test polls "C:\Users\<myname>\PycharmProjects\mysite"
Testing started at 8:40 PM ...
Creating test database for alias 'default'...
Type 'yes' if you would like to try deleting the test database 'test_<database>', or 'no' to cancel: Got an error creating the test database: permission denied to create database

根据我的阅读,显然 Heroku PG 使用共享数据库,所以我没有创建/销毁数据库的权限,这是测试所必需的。有没有明显的解决方案?我仍在本地驱动器上开发,因此任何解决方法都将不胜感激。我知道测试是编程的重要组成部分,所以我希望能够尽快实现测试方法。

我正在尝试使用TestCase django 类进行测试。

我正在使用什么: 1) Heroku Postgres 爱好开发计划 2) Postgres 9.3.3 3) Python 2.7.6 4) Django 1.6.1

编辑: 所以在做了更多的研究之后,我发现我可以在 settings.py 中覆盖我的DATABASES dict 变量以使用 SQLite 在本地进行测试(当 'test' 是 shell 中的参数时),但我仍然更喜欢 PostgreSQL实施,因为根据我的阅读,PostgreSQL 更加严格(我是它的粉丝)。

对于任何对我找到的半解决方案感兴趣的人(由 *** 的另一位成员提供):

if 'test' in sys.argv:
    DATABASES['default'] = 'ENGINE': 'django.db.backends.sqlite3'

别忘了导入sys

【问题讨论】:

【参考方案1】:

您没有理由需要为您的测试创建一个数据库。相反,如果未定义 DATABASE_URL 环境变量,请更改您的测试以访问本地数据库。这是我在 Node.js 中所做的事情,其中​​我有本地测试和开发数据库,​​以及 Heroku 提供的生产数据库:

if (typeof(process.env.DATABASE_URL) !== 'undefined') 
  dbUrl = url.parse(process.env.DATABASE_URL);

else if (process.env.NODE_ENV === 'test') 
  dbUrl = url.parse('tcp://postgres:postgres@127.0.0.1:5432/test');

else 
  dbUrl = url.parse('tcp://postgres:postgres@127.0.0.1:5432/db');

【讨论】:

Django 的测试是独立运行的,因此每个测试都会建立一个新的数据库,运行测试,然后删除该数据库,以确保在您进行计数或加入等操作时不会发生交叉对话。

以上是关于Django 测试错误“创建数据库的权限被拒绝” - 使用 Heroku Postgres的主要内容,如果未能解决你的问题,请参考以下文章

通过角色为 PostgreSQL 中的用户创建

Django 并行测试:测试进程错误地访问测试数据库

如何调试 DJango 测试服务器提供的错误 500?

(DatabaseError: no such table: django_session) Django 1.3 selenium 测试期间的错误

Django 测试用例错误“WSGIRequest”对象没有属性“会话”

django 单元测试错误总结