django test app error-Se ha producido un error al crear la base de datos de prueba: permiso denegado para crear la base de datos


Cuando intento probar cualquier aplicación con un comando (lo noté cuando intenté implementar myproject usando fabric, que usa este comando):

python manage.py test appname

Obtengo este error:

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 el comando parece funcionar. Configuración de mi base de datos en 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

Cuando Django ejecuta el conjunto de pruebas, crea una nueva base de datos, en su caso test_finance. El usuario de postgres con nombre de usuario django no tiene permiso para crear una base de datos, de ahí el mensaje de error.

Cuando ejecuta migrate o syncdb, Django no intenta crear la base de datos finance, por lo que no obtiene ningún error.

Puede agregar el permiso createdb al usuario django ejecutando el siguiente comando en el shell postgress como superusuario (hat tip to this stack overflow respuesta).

=> ALTER USER django CREATEDB;

Nota: El nombre de usuario utilizado en el comando ALTER USER <username> CREATEDB; debe coincidir con el usuario de la base de datos en sus archivos de configuración de Django. En este caso, el póster original, tenía al usuario como django la respuesta anterior.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-18 18:14:21

He encontrado una solución interesante a su problema.
De hecho, para MySQL puede otorgar privilegios para bases de datos no existentes.
Por lo tanto, puede agregar el nombre 'test_finance' para su base de datos de pruebas en su configuración:

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

Inicie MySQL shell como usuario root:

mysql -u root -p

Y ahora concede todos los privilegios a esta base de datos inexistente en MySQL:

GRANT ALL PRIVILEGES ON test_finance.* TO 'django'@'localhost';

Ahora Django iniciará las pruebas sin ningún problema.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-16 18:16:32

Si la base de datos es mysql entonces estos dos cambios harán las cosas.

1.Abrir mysite/mysite/settings.py

La configuración de su base de datos debe tener un bloque de PRUEBA adicional como se muestra con projectname_test.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'myproject',
        'USER': 'chandan',
        'PASSWORD': 'root',
        'HOST': 'localhost',
        'PORT': '3306',
        'TEST': {
            'NAME': 'myproject_test',
        },
    }
}

2.Escriba el siguiente comando usando mysql command prompt o mysql workbench para dar todos los privilegios al usuario especificado en settings.py

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

Ahora puedes ejecutar 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-30 07:39:07

En el caso de Postgres, el usuario debe tener permiso createdb.

ALTER ROLE miriam CREATEDB;

Ver esta documentación: 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-05 04:15:17

Si estás usando docker-compose lo que funcionó para mí fue lo siguiente:

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

O

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

Mi configuración se ve así:

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

Y mi docker-compose.yml se ve como sigue:

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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-10-11 19:59:20