no se puede crear una extensión sin el rol de superusuario


Estoy tratando de ejecutar pruebas unitarias en Django, y crea una nueva base de datos. La base de datos tiene extensiones postgis y cuando regularmente creo la base de datos, uso "CREAR extensión postgis".

Sin embargo, cuando corro pruebas, me da el siguiente 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.

El usuario ya tiene el privilegio Crear DB, estoy usando PostgreSQL 9.1 en Ubuntu 12.04 con Postgis 2.0.

Author: Rudolf Olah, 2013-05-13

3 answers

La documentación de Django en postgis tiene cierta información sobre la configuración de privilegios de usuario .

En el peor de los casos puedes crear un nuevo superusuario:

$ createuser --superuser <user_name>

O alterar el rol de un usuario existente:

postgres# ALTER ROLE <user_name> SUPERUSER;
 67
Author: Rudolf Olah,
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
2013-05-13 17:48:25

La forma más fácil que encontré es:

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

Básicamente dar al usuario poderes de superusuario por un corto tiempo, y crear la extensión. Entonces revoca los poderes de superusuario.

También puede usar \connect user_name para convertirse en ese usuario y crear la extensión directamente desde el usuario postgres.

 30
Author: Ariel,
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
2016-09-27 19:21:48

Otra forma de resolver esto que se sugiere en el django docs

$ psql <db name>
> CREATE EXTENSION postgis;

Puede iniciar sesión en una base de datos como superusuario y crear la extensión una vez. La extensión estará disponible para el usuario de la base de datos de su api. Cuando django ejecuta CREATE EXTENSION IF NOT EXISTS postgis postgres no lanzará.

Si está viendo errores al migrar doublecheck ha creado la extensión en la base de datos correcta, un ejemplo de sesssion

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

Puede verificar que la extensión está instalada si ve la tabla spatial_ref_sys

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

Para las pruebas recomiendo ejecutarlas en una base de datos de desarrollo local y otorgar al usuario habilidades de superusuario como > ALTER ROLE <user_name> SUPERUSER;

 1
Author: Harry Moreno,
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-08-28 02:17:36