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 119

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"