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

462voto

Alasdair Points 36535

Lorsque Django exécute la suite de tests, il crée une nouvelle base de données, dans votre cas test_finance . L'utilisateur postgres avec le nom d'utilisateur django n'a pas la permission de créer une base de données, d'où le message d'erreur.

Lorsque vous exécutez migrate o syncdb Django n'essaye pas de créer le fichier finance de la base de données, pour ne pas avoir d'erreurs.

Vous pouvez ajouter la permission createdb à l'utilisateur django en exécutant la commande suivante dans le shell postgres en tant que superutilisateur (conseil de chapeau à cette réponse de stack overflow ).

=> ALTER USER django CREATEDB;

Note : Le nom d'utilisateur utilisé dans le ALTER USER <username> CREATEDB; doit correspondre à l'utilisateur de la base de données dans vos fichiers de configuration de Django. Dans ce cas, le posteur d'origine avait l'utilisateur en tant que django la réponse ci-dessus.

23voto

George H. Points 454

J'ai trouvé une solution intéressante à votre problème.
En fait, pour MySQL, vous pouvez accorder des privilèges pour une base de données inexistante.
Vous pouvez donc ajouter le nom 'test_finance' pour votre base de données de test dans vos paramètres :

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

démarrer le shell MySQL en tant qu'utilisateur Root :

mysql -u root -p

et accordez maintenant tous les privilèges à cette base de données inexistante dans MySQL :

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

Maintenant, Django lancera les tests sans aucun problème.

8voto

Noufal Valapra Points 81

Dans le cas de Postgres, l'utilisateur doit avoir createdb permission.

ALTER ROLE miriam CREATEDB;

Voir cette documentation : https://docs.djangoproject.com/en/2.0/topics/testing/overview/#the-test-database

7voto

Chandan Points 238

Si la base de données est mysql alors ces deux changements permettront d'accomplir les choses.

1. Ouvrir mysite/mysite/settings.py

Les paramètres de votre base de données doivent comporter un bloc TEST supplémentaire, comme illustré ci-dessous. nom du projet_test .

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

2. tapez la commande suivante en utilisant invite de commande mysql o banc d'essai mysql pour donner tous les privilèges à l'utilisateur spécifié en paramètres.py

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

Maintenant, vous pouvez exécuter python manage.py test polls .

6voto

JavierFuentes Points 774

Dans mon cas, les solutions GRANT PRIVILEGES ne fonctionnaient pas avec Python 3.7.2 , Django 2.1.7 y MySQL 5.6.23 ... Je ne sais pas pourquoi.

J'ai donc décidé d'utiliser SQLite comme base de données de TEST...

DATABASES = {
    'default': {
        'NAME': 'productiondb',
        'ENGINE': 'mysql.connector.django',   # 'django.db.backends.mysql'
        'USER': '<user>',
        'PASSWORD': '<pass>',
        'HOST': 'localhost',
        'PORT': 3306,
        'OPTIONS': {
            'autocommit': True,
        },
        'TEST': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        },
    }
}

Après cela, la voiture TESTS fonctionne sans problème :

$ python manage.py test
Creating test database for alias 'default'...
System check identified no issues (0 silenced).

Destroying test database for alias 'default'...
----------------------------------------------------------------------
Ran 0 tests in 0.000s

OK

Process finished with exit code 0

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