Django测试应用程序错误 - 创建测试数据库时出错:没有权限创建数据库。

256

当我尝试使用命令行测试任何应用程序时(我注意到这一点是在尝试使用使用此命令的Fabric部署我的项目时),会出现以下情况:

python manage.py test appname

我遇到了这个错误:

Creating test database for alias 'default'...
Got an error creating the test database: permission denied to create database

Type 'yes' if you would like to try deleting the test database 'test_finance', or 'no' to cancel

syncdb 命令似乎有效。我的 settings.py 文件中的数据库设置为:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': 'finance',                      # Or path to database file if using sqlite3.
        'USER': 'django',                      # Not used with sqlite3.
        'PASSWORD': 'mydb123',                  # Not used with sqlite3.
        'HOST': '127.0.0.1',                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
    }
}
15个回答

1

2
ALTER USER django WITH SUPERUSER,您忘记了USER关键字。我尝试编辑您的帖子,但编辑队列已满且无法释放。 - run_the_race

0

正如错误提示所示,用户没有足够的权限来创建数据库。Django在测试期间创建一个单独的数据库,以确保我们的原始开发数据库不受影响。

我们可能需要通过Postgres shell授予权限。

DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.postgresql_psycopg2',
    'NAME': config('DB_NAME'),
    'USER': "myuser",
    'PASSWORD': config('DB_PASSWORD'),
    'HOST': config('DB_HOST'),
    'PORT': config('DB_PORT'),

    'TEST': {
        'NAME': 'test_nofoobar',
    },
}

}

根据设置,此处数据库用户的名称为myuser。因此,让我们启动Postgres shell并授予数据库创建权限。
sudo -u postgres psql


psql (14.5 (Ubuntu 14.5-1.pgdg22.04+1))

postgres=# ALTER ROLE myuser CREATEDB;
Output: ALTER ROLE

0

你也可以手动创建一个测试数据库,只需在settings.py中添加TEST键即可。

然后将MIRROR键的值设置为“default”,这样你就可以在默认数据库的精确副本或其他任何数据库上进行测试。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'finance',
        'USER': 'django',
        'TEST': {
             'MIRROR': 'default',
        },
        'PASSWORD': 'mydb123',
        'HOST': '127.0.0.1',
        'PORT': '',
    }
}

你也可以查看高级Django Postgres文档


1
这是一种错误的方法,因为它将使用真实数据库将持久化数据写入数据库中,之后无法删除。 - Elias Prado

0

也许你将测试放在了暂停模式或作为后台任务。尝试在bash shell中使用fg命令。


0

我遇到了同样的问题,是关于

pytest

我修改了 Django 用户权限,以便在运行 Python 测试用例时可以创建测试数据库。

ALTER USER USERNAME CREATEDB;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接