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

当前回答

我不久前也遇到了同样的问题。 这就是我如何能够解决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的用户权限,这样它就可以在运行python测试用例时创建一个测试数据库。

修改用户名

您也可以手动创建一个测试数据库,但将test键放在settings.py中

然后用值'default'填充传递MIRROR键,这样你就可以测试默认db的精确副本,或者任何你喜欢的db。

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的高级文档

哇,把这里所有的答案结合起来,稍加调整,终于让我得到了一个适用于docker-compose、django和postgres的解决方案……

首先,noufal valapra给出的postgres命令是不正确的(或者可能只是不当前),它应该是:

ALTER USER docker WITH CREATEDB;

在docker-compose设置的情况下,这将进入init。SQL文件,这是我的看起来像:

CREATE USER docker;
ALTER USER docker WITH CREATEDB;
CREATE DATABASE djangodb;
GRANT ALL PRIVILEGES ON DATABASE djangodb TO docker;

然后postgres的Dockerfile是这样的:

FROM postgres:10.1-alpine
COPY init.sql /docker-entrypoint-initdb.d/

然后Django settings.py有这样的条目:

if 'RDS_DB_NAME' in os.environ:
    INTERNAL_DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': os.environ['RDS_DB_NAME'],
            'USER': os.environ['RDS_USERNAME'],
            'PASSWORD': os.environ['RDS_PASSWORD'],
            'HOST': os.environ['RDS_HOSTNAME'],
            'PORT': os.environ['RDS_PORT'],
        }
    }

docker-compose看起来是这样的:

版本:“3.6”

服务:

postgresdb:
  build:
    context: ./
    dockerfile: ./Dockerfile-postgresdb
  volumes:
    - postgresdata:/var/lib/postgresql/data/

django:
  build:
    context: ../
    dockerfile: ./docker/Dockerfile
  environment:
    - RDS_DB_NAME=djangodb
    - RDS_USERNAME=docker
    - RDS_PASSWORD=docker
    - RDS_HOSTNAME=postgresdb
    - RDS_PORT=5432

  stdin_open: true
  tty: true
  depends_on:
    - postgresdb

volumes:
    postgresdata:

我不久前也遇到了同样的问题。 这就是我如何能够解决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'...

在我的情况下,我不知道为什么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