it-swarm.com.ru

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

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

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

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

Вы можете добавить разрешение созданного пользователя Django, выполнив следующую команду в командной консоли postgres от имени суперпользователя (подсказка этот ответ о переполнении стека ).

=> ALTER USER Django CREATEDB;

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

304
Alasdair

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

12
Yurii Halapup

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

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

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

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

3
Chandan

В случае Postgres пользователь должен иметь разрешение createdb.

ALTER ROLE miriam CREATEDB;

Смотрите эту документацию: https://docs.djangoproject.com/en/2.0/topics/testing/overview/#the-test-database

3
noufal valapra

Ничего себе, объединяя все ответы здесь с небольшой настройкой, наконец, я получил рабочее решение для docker-compose, Django и postgres ...

Во-первых, команда postgres, данная noufal valapra, неверна (или, возможно, просто не актуальна), она должна быть:

ALTER USER docker WITH CREATEDB;

В случае установки docker-compose это будет идти в файле init.sql, вот так выглядит мой:

CREATE USER docker;
ALTER USER docker WITH CREATEDB;
CREATE DATABASE djangodb;
GRANT ALL PRIVILEGES ON DATABASE djangodb TO docker;

Тогда Dockerfile для postgres выглядит так:

FROM postgres:10.1-Alpine
COPY init.sql /docker-entrypoint-initdb.d/

Тогда в Django settings.py есть эта запись:

if 'RDS_DB_NAME' in os.environ:
    INTERNAL_DATABASES = {
        'default': {
            'ENGINE': 'Django.db.backends.postgresql_psycopg2',
            'NAME': os.environ['RDS_DB_NAME'],
            'USER': os.environ['RDS_USERNAME'],
            'PASSWORD': os.environ['RDS_PASSWORD'],
            'Host': os.environ['RDS_HOSTNAME'],
            'PORT': os.environ['RDS_PORT'],
        }
    }

и docker-compose выглядит так:

версия: '3.6'

сервисы:

postgresdb:
  build:
    context: ./
    dockerfile: ./Dockerfile-postgresdb
  volumes:
    - postgresdata:/var/lib/postgresql/data/

Django:
  build:
    context: ../
    dockerfile: ./docker/Dockerfile
  environment:
    - RDS_DB_NAME=djangodb
    - RDS_USERNAME=docker
    - RDS_PASSWORD=docker
    - RDS_HOSTNAME=postgresdb
    - RDS_PORT=5432

  stdin_open: true
  tty: true
  depends_on:
    - postgresdb

volumes:
    postgresdata:
0
Paul Jacobs

Если вы используете 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"
0
lmiguelvargasf