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を使用しています。
Django postgisのドキュメントには、ユーザー特権の設定に関する情報があります 。
最悪の場合、新しいスーパーユーザーを作成できます。
$ createuser --superuser <user_name>
または、既存のユーザーの役割を変更します。
postgres# ALTER ROLE <user_name> SUPERUSER;
私が見つけた最も簡単な方法は:
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
ユーザーから直接拡張機能を作成することもできます。
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;
のようなユーザーのスーパーユーザー機能を付与することをお勧めします