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.
    }
}
Author: 3cheesewheel, 2013-01-06

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ź.

 265
Author: Alasdair,
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.

 9
Author: George H.,
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.

 2
Author: Chandan,
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

 2
Author: noufal valapra,
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"
 0
Author: lmiguelvargasf,
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