błąd aplikacji testowej django - otrzymałem błąd podczas tworzenia testowej bazy danych: Odmowa uprawnień do tworzenia bazy danych
Kiedy próbuję przetestować dowolną aplikację za pomocą polecenia (zauważyłem to, gdy próbowałem wdrożyć MyProject przy użyciu fabric, który używa tego polecenia):
python manage.py test appname
Dostaję ten błąd:
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
dowództwo wydaje się działać. Moje Ustawienia bazy danych w 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 answers
Kiedy Django uruchamia zestaw testów, tworzy nową bazę danych, w Twoim przypadku test_finance
. Użytkownik postgres z nazwą użytkownika django
nie ma uprawnień do tworzenia bazy danych, stąd komunikat o błędzie.
Kiedy uruchamiasz migrate
lub syncdb
, Django nie próbuje tworzyć bazy danych finance
, więc nie dostajesz żadnych błędów.
Możesz dodać uprawnienia createdb do użytkownika django, uruchamiając następujące polecenie w powłoce postgress jako superuser (Hat tip to this stack overflow odpowiedź).
=> ALTER USER django CREATEDB;
Uwaga: nazwa użytkownika użyta w poleceniu ALTER USER <username> CREATEDB;
musi pasować do użytkownika bazy danych w plikach ustawień Django. W tym przypadku oryginalny plakat miał użytkownika jako django
powyższa odpowiedź.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-18 18:14:21
Znalazłem ciekawe rozwiązanie twojego problemu.
W rzeczywistości dla MySQL można przyznać uprawnienia dla nieistniejącej bazy danych.
Możesz więc dodać nazwę 'test_finance' do bazy testowej w Ustawieniach:
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',
},
}
}
Uruchom MySQL shell jako użytkownik root:
mysql -u root -p
A teraz nadaj wszystkie uprawnienia tej nieistniejącej bazie danych w MySQL:
GRANT ALL PRIVILEGES ON test_finance.* TO 'django'@'localhost';
Teraz Django rozpocznie testy bez żadnych problemów.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-16 18:16:32
Jeśli baza danych to mysql wtedy te dwie zmiany załatwią sprawę.
1.Otwórz mysite/mysite/settings.py
Ustawienia bazy danych powinny mieć dodatkowy blok testowy, jak pokazano w projectname_test.
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'myproject',
'USER': 'chandan',
'PASSWORD': 'root',
'HOST': 'localhost',
'PORT': '3306',
'TEST': {
'NAME': 'myproject_test',
},
}
}
2.Wpisz poniższe polecenie używając MySQL command prompt lub mysql workbench , aby dać użytkownikowi wszystkie przywileje określone w settings.py
GRANT ALL PRIVILEGES ON myproject_test.* TO 'chandan'@'localhost';
Teraz możesz biec python manage.py test polls
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-30 07:39:07
W przypadku Postgres, użytkownik musi mieć createdb
uprawnienia.
ALTER ROLE miriam CREATEDB;
Zobacz tę dokumentację: https://docs.djangoproject.com/en/2.0/topics/testing/overview/#the-test-database
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-05 04:15:17
Jeśli używasz docker-compose
to, co działało dla mnie, było następujące:
ALTER ROLE username CREATEDB;
GRANT ALL PRIVILEGES ON test_database_name.* TO 'username';
Lub
ALTER ROLE username CREATEDB;
GRANT ALL PRIVILEGES ON *.* TO 'username'@'%';
Moje ustawienia wyglądają tak:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'database_name',
'USER': 'username',
'PASSWORD': 'password',
'HOST': 'db',
'PORT': '3306',
}
}
I moje docker-compose.yml
wygląda następująco:
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"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-11 19:59:20