django test app error-ошибка при создании тестовой базы данных: отказано в разрешении на создание базы данных

когда я пытаюсь протестировать любое приложение с помощью команды (я заметил это, когда пытался развернуть myproject с помощью 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.
    }
}

5 ответов


когда Django запускает набор тестов, он создает новую базу данных, в вашем случае test_finance. Пользователь postgres с именем пользователя django не имеет разрешения на создание базы данных, отсюда и сообщение об ошибке.

при выполнении migrate или syncdb, Django не пытается создать finance база данных, так что вы не получите никаких ошибок.

вы можете добавить разрешение createdb пользователю django, выполнив следующую команду в оболочке postgress в качестве суперпользователя (hat tip to этот ответ переполнения стека).

=> ALTER USER django CREATEDB;

Примечание: имя пользователя, используемое в ALTER USER <username> CREATEDB; команда должна соответствовать пользователю базы данных в файлах настроек Django. В этом случае, оригинальный плакат, у пользователя django ответ выше.


Я нашел интересное решение своей проблемы.
Фактически для 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 shell как пользователь root:

mysql -u root -p

и теперь предоставьте все привилегии этой несуществующей базе данных в MySQL:

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

Теперь Django начнет тесты без каких-либо проблем.


Если база данных в MySQL тогда эти два изменения сделают все, что нужно.

1.Открыть 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',
        },
    }
}

2.Введите следующую команду, используя командная строка mysql или инструментальные средства MySQL чтобы предоставить все привилегии пользователю, указанному в settings.py

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

Теперь вы можете запустить python manage.py test polls.


в случае Postgres пользователь должен иметь createdb разрешения.

ALTER ROLE miriam CREATEDB;

см. эту документацию: https://docs.djangoproject.com/en/2.0/topics/testing/overview/#the-test-database


если вы используете 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"