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