当我尝试用命令测试任何应用程序时(我注意到当我尝试使用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.
    }
}

当前回答

在我的情况下,我不知道为什么GRANT PRIVILEGES解决方案不适用于Python 3.7.2, Django 2.1.7和MySQL 5.6.23。 所以我决定使用SQLite作为TEST数据库:

DATABASES = {
    'default': {
        'NAME': 'productiondb',
        'ENGINE': 'mysql.connector.django',   # 'django.db.backends.mysql'
        'USER': '<user>',
        'PASSWORD': '<pass>',
        'HOST': 'localhost',
        'PORT': 3306,
        'OPTIONS': {
            'autocommit': True,
        },
        'TEST': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        },
    }
}

在此之后,测试可以正常运行:

$ python manage.py test
Creating test database for alias 'default'...
System check identified no issues (0 silenced).

Destroying test database for alias 'default'...
----------------------------------------------------------------------
Ran 0 tests in 0.000s

OK

Process finished with exit code 0

其他回答

检查运行时的操作并切换数据库

import sys
TESTING = sys.argv[1:2] == ['test']
if TESTING==False:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': config('DB_NAME'),
            'USER': config('DB_USER'),
            'PASSWORD': config('DB_PASSWORD'),
            'HOST': config('DB_HOST'),
            'PORT': ''
             }       
           }
else:
    DATABASES = {    
        'default': {
        "ENGINE": "django.db.backends.sqlite3",
        "TEST": {
            "NAME": os.path.join(BASE_DIR, "test_db.sqlite3"),
        }
    }}

我不久前也遇到了同样的问题。 这就是我如何能够解决django 3.10.6

首先使用这个命令通过终端进入dbshell

python3 manage.py dbshell

这将带您到您的项目dbie,如果您已经创建了一个。 另一种获取数据库的方法是:

sudo su postgres

然后:

psql

这将把您带到默认数据库。然后连接到你的项目db通过:

\c projectdb

在这一点上,使用这个命令来修复你的错误:

ALTER USER you CREATEDB;

用'\q'退出数据库;使用' Exit '退出postgres,然后运行:

python3 manage.py test app

错误将被修复,您的测试将通过

Found 1 test(s).
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
.
----------------------------------------------------------------------
Ran 1 test in 0.003s

OK
Destroying test database for alias 'default'...

超级用户帐户是保证测试顺利进行的最简单方法。因此,创建django用户su的一个更简单的方法是执行ALTER django WITH SUPERUSER。

更多信息https://www.postgresql.org/docs/current/sql-alteruser.html

错误提示用户没有创建数据库的足够权限。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

如果数据库是MySQL,那么这两个更改将完成任务。

1.Open mysite mysite / settings.py

您的数据库设置应该有一个额外的“TEST”块,如projectname_test所示。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'myproject',
        'USER': 'chandan',
        'PASSWORD': 'root',
        'HOST': 'localhost',
        'PORT': '3306',
        'TEST': {
            'NAME': 'myproject_test',
        },
    }
}

2.使用mysql命令提示符或mysql工作台输入下面的命令,将所有权限赋予settings.py中指定的用户

GRANT ALL PRIVILEGES ON myproject_test.* TO 'chandan'@'localhost';

现在你可以运行下面的命令:

python manage.py test polls