73

我正在尝试在 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.

用户已经拥有 Create DB 权限,我在 Ubuntu 12.04 上使用 PostgreSQL 9.1 和 Postgis 2.0。

4

6 回答 6

126

postgis 上的 Django 文档有一些关于设置用户权限的信息

在最坏的情况下,您可以创建一个新的超级用户:

$ createuser --superuser <user_name>

或更改现有用户的角色:

postgres# ALTER ROLE <user_name> SUPERUSER;
于 2013-05-13T17:48:25.823 回答
66

我发现最简单的方法是:

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用户创建扩展。

于 2016-09-27T19:21:48.103 回答
28

django docs中建议的另一种解决方法

$ psql <db name>
> CREATE EXTENSION postgis;

您可以以超级用户身份登录数据库并创建一次扩展。然后,您的 api 的 db 用户将可以使用该扩展。当 django 执行CREATE EXTENSION IF NOT EXISTS postgispostgres 时不会抛出。

如果您在迁移双重检查时看到错误,您在正确的数据库中创建了扩展,示例会话

$ 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

对于测试,我建议针对本地开发数据库运行它们并授予用户超级用户能力,例如> ALTER ROLE <user_name> SUPERUSER;

于 2018-07-18T06:58:43.083 回答
15

您还可以安装postgistemplate1所有新创建的数据库默认继承的数据库模板。

$ psql -U postgres -d template1 -c "CREATE EXTENSION postgis;"

从此时创建的所有新数据库都将postgis安装扩展,包括 Django 的测试数据库,除非它们在创建数据库时指定不同的模板。

如果postgis不希望安装到所有新创建的数据库,您可以创建一个新模板,postgis在其中安装,然后让 Django 在创建测试数据库时使用此模板。

$ createdb template_postgis;  # create a new database
$ psql -U postgres -c "UPDATE pg_database SET datistemplate = TRUE WHERE datname = 'template_postgis';"  # make it a template
$ psql -U postgres -d template_postgis -c "CREATE EXTENSION postgis;"  # install postgis in it

然后在 Django 设置中:

...
DATABASES = {
    'default': {
        ...
        'TEST': {
            'TEMPLATE': 'template_postgis',
        },
    },
}
于 2019-11-27T16:01:22.590 回答
6

在不委派超级用户权限的情况下执行此操作的一种安全方法是使用具有超级用户角色(如 postgres)的用户访问我们正在执行查询的数据库。

$ sudo -u postgres psql <db_name>

<db_name>#= CREATE EXTENSION IF NOT EXISTS <your-extension>;

这样您就不会暴露安全性,并且您可以相信数据库中的扩展。

总帐

于 2020-08-24T04:36:25.767 回答
3

CREATE从 Postgres 13 开始,一些模块/扩展被认为是“受信任的”,并且可以由对当前数据库具有特权的非超级用户安装。

受信任的模块有:btree_gin、btree_gist、citext、cube、dict_int、fuzzystrmatch、hstore、intarray、is、lo、ltree、pgcrypto、pg_trgm、seg、tablefunc、tcn、tsm_system_rows、tsm_system_time、unaccent、uuid-ossp

要检查给定模块是否符合条件,请访问https://www.postgresql.org/docs/13/contrib.html并选择有问题的模块。如果它被认为是“受信任的”,则该页面将包含以下句子:

CREATE这个模块被认为是“受信任的”,也就是说,它可以由对当前数据库具有权限的非超级用户安装。

于 2020-09-07T17:20:59.237 回答