Когда я пытаюсь протестировать любое приложение с помощью команды (я заметил это, когда попытался развернуть 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 запускает тестовый пакет, он создает новую базу данных в вашем случае test_finance. У пользователя postgres с именем пользователя django
нет разрешения на создание базы данных, поэтому сообщение об ошибке.
Когда вы запускаете syncdb, Django не пытается создать базу данных финансов, поэтому вы не получите никаких ошибок.
Вы можете добавить разрешение createdb для пользователя django, выполнив следующую команду в postgress shell в качестве суперпользователя (подсказка для чата до этого ответа).
=> 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 в качестве пользователя root:
mysql -u root -p
и теперь предоставить все привилегии этой несуществующей базе данных в MySQL:
GRANT ALL PRIVILEGES ON test_finance.* TO 'django'@'localhost';
Теперь Django начнет тесты без проблем.
Если база данных 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
.