我尝试在 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.
用户已经拥有创建数据库权限,我在 Ubuntu 12.04 上使用 PostgreSQL 9.1 和 Postgis 2.0。
postgis 上的 Django 文档有一些关于设置数据库用户权限的信息。
在最坏的情况下,您可以为 PostgreSQL 创建一个新的数据库超级用户:
$ 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
用户创建扩展程序。
$ psql <db name>
> CREATE EXTENSION postgis;
您可以以超级用户身份登录数据库并创建一次扩展。然后,该扩展将可供您的 api 的数据库用户使用。当 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
对于测试,我建议针对本地开发数据库运行它们,并授予用户超级用户能力,例如
> ALTER ROLE <user_name> SUPERUSER;
postgis
安装到
template1
数据库模板中,默认情况下所有新创建的数据库都会继承该模板。
$ 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',
},
},
}
CREATE
权限的非超级用户安装。可信模块有: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
权限的非超级用户安装。
$ sudo -u postgres psql <db_name>
<db_name>#= CREATE EXTENSION IF NOT EXISTS <your-extension>;
这样您就不会暴露安全性,并且可以相信数据库中的扩展。GL
vector
扩展添加到
bitnami/postgresql
Helm 图表。 我能够使用 Dockerfilehere 创建自定义 Docker 映像,并使用自定义标签对其进行标记 (
acme/postgresql:1.0.0
)。然后,我在 Bitnami Postgres Helm 图表中覆盖如下设置以使用这个新图像:
postgresql:
enabled: true
auth:
postgresPassword: password
database: foo
image:
repository: acme/postgresql
tag: 1.0.0
primary:
initdb:
user: postgres
password: password
scripts:
dbinit.sql: |
CREATE USER foo WITH ENCRYPTED PASSWORD 'password';
GRANT USAGE, CREATE ON SCHEMA public TO foo;
GRANT ALL PRIVILEGES ON DATABASE foo TO foo;
ALTER DATABASE foo OWNER TO foo;
\c foo;
CREATE EXTENSION vector;
请注意,我运行 postgres
脚本的
dbinit.sql
用户是超级用户。这里很重要的一点是
\c foo
线。 如果没有这个,
vector
扩展就不会安装,因为 Postgres 不知道要安装在哪个数据库上。