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"