Django的测试应用程序错误 - 得到一个错误创建测试数据库:许可被拒绝创建数据库(django

2019-07-17 22:09发布

当我尝试测试用命令的任何应用程序(我注意到它时,我试着用布,使用此命令部署的myproject):

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.
    }
}

Answer 1:

当Django运行测试套件,它会创建一个新的数据库,你的情况test_finance 。 帐号postgres用户django没有权限创建一个数据库,因此错误消息。

当您运行migratesyncdb ,Django不尝试创建finance数据库,这样你就不会得到任何错误。

您可以通过运行以下命令,在Postgres的壳作为超级用户(帽尖到CREATEDB权限添加到Django的用户这个堆栈溢出的答案 )。

=> ALTER USER django CREATEDB;

注意:在使用的用户名ALTER USER <username> CREATEDB; 命令需要数据库的用户在你的Django设置文件相匹配。 在这种情况下,原来的海报,有用户作为django上述答复。



Answer 2:

我发现有趣的解决您的问题。
事实上为MySQL您可以授予不存在的数据库权限。
所以,你可以添加名称“test_finance”在您设置您的测试数据库:

    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.
        'TEST': {
            'NAME': 'test_finance',
        },
    }
}

启动MySQL壳作为根用户:

mysql -u root -p

现在授予所有的权限在MySQL这个不存在的数据库:

GRANT ALL PRIVILEGES ON test_finance.* TO 'django'@'localhost';

现在Django将开始没有任何问题的测试。



Answer 3:

在Postgres里的情况下,用户必须拥有createdb权限。

ALTER ROLE miriam CREATEDB;

看到这个文档: https://docs.djangoproject.com/en/2.0/topics/testing/overview/#the-test-database



Answer 4:

如果数据库是MySQL的 ,然后这两个变化将完成这项事情。

1.Open mysite的/ mysite的/ settings.py

你的数据库的设置应该有一个额外的试块,如图与projectname_test。

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

使用MySQL的命令提示MySQL工作台给所有的privilages在settings.py指定的用户2.键入以下命令

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

现在,您可以运行python manage.py test polls



Answer 5:

如果您使用的docker-compose什么工作对我来说是以下几点:

ALTER ROLE username CREATEDB;
GRANT ALL PRIVILEGES ON test_database_name.* TO 'username';

要么

ALTER ROLE username CREATEDB;
GRANT ALL PRIVILEGES ON *.* TO 'username'@'%';

我的设置是这样的:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'database_name',
        'USER': 'username',
        'PASSWORD': 'password',
        'HOST': 'db',
        'PORT': '3306',
    }
}

和我的docker-compose.yml如下所示:

version: '3'
services:
  web:
      build: .
      command: './wait_for_db_and_start_server.sh'
      env_file: env_web
      working_dir: /project_name
      links:
        - db
      volumes:
        - .:/volume_name
      ports:
        - "8000:8000"
      depends_on:
        - db
  db:
    image: mysql:5.7
    restart: always
    env_file: env_db
    working_dir: /db
    volumes:
      - ./Dump.sql:/db/Dump.sql
    ports:
      - "3306:3306"


Answer 6:

哇所以稍加调整结合在这里所有的答案终于得到了我的搬运工,撰写,Django的,和Postgres工作解决方案...

首先,Postgres的命令由noufal valapra给出的是不正确的(或者只是没有电流),它应该是:

ALTER USER docker WITH CREATEDB;

在泊坞窗,撰写设置的情况下,这会在init.sql文件,这就是我的样子:

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

然后Dockerfile Postgres的是这样的:

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

和泊坞窗,撰写如下:

版本: '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:


Answer 7:

在我的情况下,授予权限的解决方案并没有与Python 3.7.2,Django 的2.1.7MySQL 23年6月5日工作...我不知道为什么。

所以我决定使用SQLite作为一个测试数据库...

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


文章来源: django test app error - Got an error creating the test database: permission denied to create database