Ошибка тестового приложения django - Произошла ошибка при создании тестовой базы данных: отказано в разрешении на создание базы данных

95

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

3 ответа

222
Лучший ответ

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

Когда вы запускаете syncdb, Django не пытается создать базу данных финансов, поэтому вы не получите никаких ошибок.

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

=> ALTER USER django CREATEDB;

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

  • 1
    Несмотря на то, что OP использовал postgresql, если вы используете mysql, у вас будет та же ошибка. Вы можете исправить это для mysql с помощью: => GRANT ALL ON *. * TO django @ localhost; Первоначально я пытался только GRANT CREATE ... но затем не мог выбрать или удалить созданную базу данных. По сути, это делает вашего пользователя суперпользователем, поэтому будьте осторожны.
  • 1
    Я немного поэкспериментировал и обнаружил, что минимальные глобальные привилегии: - Данные: SELECT, INSERT, UPDATE, DELETE, Структура: CREATE, ALTER, INDEX, DROP, Admin: REFERENCES. Не супер-пользователь, но все еще довольно мощный, поэтому будьте осторожны.
6

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

mysql -u root -p

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

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

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

1

Если база данных mysql, то эти два изменения сделают это.

1.Откройте 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 workbench, чтобы предоставить все привилегии пользователю, указанному в settings.py

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

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

  • 0
    Вопрос, очевидно, использует Postgres в качестве СУБД. К чему будет относиться projectname_test ?
  • 0
    @ code-kobold 7, Да, но я также вижу ту же ошибку в mysql. Значение имя_проекта_test ссылается на имя проекта ex. В моем ответе это myproject.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню