I'm trying to run unit tests in Django, and it creates a new database. The database has postgis extensions and when I regularly create the database, I use "CREATE ExTENSION postgis".
However, when I run tests, it gives me the following error:
$ ./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.
The user has the Create DB privilege already, I'm using PostgreSQL 9.1 on Ubuntu 12.04 with Postgis 2.0.
Easiest way I found is to:
Basically give the user superuser powers for a short time, and create the extension. Then revoke the superuser powers.
You can also use
\connect user_name
to become that user and create the extension directly from thepostgres
user.Another way to solve this that is suggested in the django docs
you can log into a database as the superuser and create the extension once. The extension will then be available to your api's db user. When django executes
CREATE EXTENSION IF NOT EXISTS postgis
postgres will not throw.If you are seeing errors when migrating doublecheck you created the extension in the correct database, a sample sesssion
you can verify the extension is installed if you see the table
spatial_ref_sys
for tests I recommend running them against a local dev database and granting the user superuser abilities like
> ALTER ROLE <user_name> SUPERUSER;
The Django documentation on postgis has some information on setting up user privileges.
In the worst case you can create a new superuser:
or alter an existing user's role: