230 votes

django test app error - Une erreur s'est produite lors de la création de la base de données de test : permission denied to create database (permission refusée pour créer la base de données)

Lorsque j'essaie de tester une application avec la commande (je l'ai remarqué lorsque j'ai essayé de déployer mon projet en utilisant fabric, qui utilise cette commande) :

python manage.py test appname

Je reçois cette erreur :

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 semble fonctionner. Mes paramètres de base de données dans 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.
    }
}

5voto

Paul Jacobs Points 400

En combinant toutes les réponses ici avec un peu d'ajustement, j'ai finalement trouvé une solution fonctionnelle pour docker-compose, django et postgres...

Tout d'abord, la commande postgres donnée par noufal valapra n'est pas correcte (ou peut-être juste pas actuelle), elle devrait l'être :

ALTER USER docker WITH CREATEDB;

Dans le cas d'une installation docker-compose, cela va aller dans le fichier init.sql, voici à quoi ressemble le mien :

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

Le fichier Docker pour postgres ressemble alors à ceci :

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

Ensuite, le fichier Django settings.py contient cette entrée :

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'],
        }
    }

et le docker-compose ressemble à ça :

version : '3.6'.

services :

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:

3voto

Passez au compte postgres sur votre serveur en tapant :

sudo -i -u postgres

Vous pouvez maintenant accéder à une invite Postgres immédiatement en tapant :

psql

Tapez maintenant

ALTER USER username CREATEDB;

3voto

lmiguelvargasf Points 9693

Si vous utilisez docker-compose Ce qui a fonctionné pour moi est le suivant :

ALTER ROLE username CREATEDB;
GRANT ALL PRIVILEGES ON test_database_name.* TO 'username';

o

ALTER ROLE username CREATEDB;
GRANT ALL PRIVILEGES ON *.* TO 'username'@'%';

Mes paramètres ressemblent à ceci :

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'database_name',
        'USER': 'username',
        'PASSWORD': 'password',
        'HOST': 'db',
        'PORT': '3306',
    }
}

et mon docker-compose.yml se présente comme suit :

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"

1voto

スラッシュ Points 29

Un compte super-utilisateur est le moyen le plus simple de garantir le bon déroulement des tests. Ainsi, un moyen plus simple de rendre l'application django l'utilisateur su doit faire ALTER django WITH SUPERUSER .

pour plus d'informations https://www.postgresql.org/docs/current/sql-alteruser.html

1voto

7guyo Points 177

Vérifiez les actions dans le runtime et changez votre base de données.

import sys
TESTING = sys.argv[1:2] == ['test']
if TESTING==False:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': config('DB_NAME'),
            'USER': config('DB_USER'),
            'PASSWORD': config('DB_PASSWORD'),
            'HOST': config('DB_HOST'),
            'PORT': ''
             }       
           }
else:
    DATABASES = {    
        'default': {
        "ENGINE": "django.db.backends.sqlite3",
        "TEST": {
            "NAME": os.path.join(BASE_DIR, "test_db.sqlite3"),
        }
    }}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X