web-dev-qa-db-ja.com

スーパーユーザーの役割なしで拡張機能を作成することはできません

Djangoで単体テストを実行しようとしていますが、新しいデータベースが作成されます。データベースにはpostgis拡張機能があり、定期的にデータベースを作成するときは、「CREATE ExTENSION postgis」を使用します。

ただし、テストを実行すると、次のエラーが表示されます。

$ ./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.

ユーザーはすでにDB作成権限を持っています。Ubuntu12.04でPostgis 2.0を使用してPostgreSQL 9.1を使用しています。

43
Rudolf Olah

Django postgisのドキュメントには、ユーザー特権の設定に関する情報があります

最悪の場合、新しいスーパーユーザーを作成できます。

$ createuser --superuser <user_name>

または、既存のユーザーの役割を変更します。

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

私が見つけた最も簡単な方法は:

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

基本的に、ユーザーに短時間スーパーユーザー権限を付与し、拡張機能を作成します。次に、スーパーユーザーの権限を取り消します。

\connect user_nameを使用してそのユーザーになり、postgresユーザーから直接拡張機能を作成することもできます。

39
Ariel

Django docs で提案されているこれを解決する別の方法

$ psql <db name>
> CREATE EXTENSION postgis;

スーパーユーザーとしてデータベースにログインし、拡張機能を1回作成できます。これにより、APIのdbユーザーが拡張機能を使用できるようになります。 DjangoがCREATE EXTENSION IF NOT EXISTS postgisを実行する場合] postgresはスローしません。

ダブルチェックを移行するときにエラーが表示される場合は、正しいデータベースに拡張機能を作成しました。サンプルセッション

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

テーブルspatial_ref_sysが表示されたら、拡張機能がインストールされていることを確認できます

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

テストのために、ローカルのdevデータベースに対してそれらを実行し、> ALTER ROLE <user_name> SUPERUSER;のようなユーザーのスーパーユーザー機能を付与することをお勧めします

9
Harry Moreno