web-dev-qa-db-fra.com

ne peut pas créer d'extension sans rôle de superutilisateur

J'essaie d'exécuter des tests unitaires dans Django, et cela crée une nouvelle base de données. La base de données a des extensions postgis et lorsque je crée régulièrement la base de données, j'utilise "CREATE ExTENSION postgis".

Cependant, lorsque j'exécute des tests, cela me donne l'erreur suivante:

$ ./manage.py test
Creating test database for alias 'default'...
Got an error creating the test database: database "test_project" already exists

Type 'yes' if you would like to try deleting the test database 'test_project', or 'no' to cancel: yes
Destroying old test database 'default'...
DatabaseError: permission denied to create extension "postgis"
HINT:  Must be superuser to create this extension.

L'utilisateur a déjà le privilège Create DB, j'utilise PostgreSQL 9.1 sur Ubuntu 12.04 avec Postgis 2.0.

43
Rudolf Olah

La documentation Django sur postgis contient des informations sur la configuration des privilèges utilisateur .

Dans le pire des cas, vous pouvez créer un nouveau superutilisateur:

$ createuser --superuser <user_name>

ou modifier le rôle d'un utilisateur existant:

postgres# ALTER ROLE <user_name> SUPERUSER;
86
Rudolf Olah

Le moyen le plus simple que j'ai trouvé est de:

su postgres
psql
alter role user_name superuser;
#then create the extension as the user in a different screen
alter role user_name nosuperuser;

Fondamentalement, donnez au superutilisateur des pouvoirs pendant une courte période et créez l'extension. Puis révoquez les pouvoirs du superutilisateur.

Vous pouvez aussi utiliser \connect user_name pour devenir cet utilisateur et créer l'extension directement à partir de l'utilisateur postgres.

39
Ariel

Une autre façon de résoudre ce problème est suggérée dans les documentation Django

$ psql <db name>
> CREATE EXTENSION postgis;

vous pouvez vous connecter à une base de données en tant que superutilisateur et créer l'extension une fois. L'extension sera alors disponible pour l'utilisateur db de votre api. Lorsque Django exécute CREATE EXTENSION IF NOT EXISTS postgis postgres ne lancera pas.

Si vous voyez des erreurs lors de la migration de doublecheck, vous avez créé l'extension dans la base de données correcte, un exemple de session

$ psql
=> \l            - list databases
=> \c <db name>  - connect to Django db
=> create extension postgis;

vous pouvez vérifier que l'extension est installée si vous voyez le tableau spatial_ref_sys

=> \dt
                   List of relations
 Schema |            Name            | Type  |  Owner
--------+----------------------------+-------+----------
 public | spatial_ref_sys            | table | postgres

pour les tests, je recommande de les exécuter sur une base de données de développement locale et d'accorder au superutilisateur des capacités comme > ALTER ROLE <user_name> SUPERUSER;

9
Harry Moreno