我正在尝试在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上使用Postgis 2.0使用PostgreSQL 9.1。
答案 0 :(得分:81)
The Django documentation on postgis has some information on setting up user privileges
在最坏的情况下,您可以创建一个新的超级用户:
$ createuser --superuser <user_name>
或更改现有用户的角色:
postgres# ALTER ROLE <user_name> SUPERUSER;
答案 1 :(得分:37)
我发现最简单的方法是:
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
用户创建扩展程序。
答案 2 :(得分:5)
$ psql <db name>
> CREATE EXTENSION postgis;
您可以以超级用户身份登录数据库并创建一次扩展。该扩展将对您的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
对于测试,我建议针对本地开发数据库运行它们,并授予用户超级用户权限,例如> ALTER ROLE <user_name> SUPERUSER;
答案 3 :(得分:2)
您还可以将postgis
安装到template1
数据库模板中,该模板默认情况下由所有新创建的数据库继承。
$ psql -U postgres -d template1 -c "CREATE EXTENSION postgis;"
此后创建的所有新数据库都将安装postgis
扩展名,包括Django的测试数据库,除非它们在创建数据库时指定了不同的模板。
如果不希望将postgis
安装到所有新创建的数据库中,则可以创建一个新模板,在其中安装postgis
,然后让Django在创建测试数据库时使用此模板。 / p>
$ 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',
},
},
}
答案 4 :(得分:0)
一种不委派超级用户特权的安全方法是使用具有超级用户角色的用户(例如postgres)访问我们正在其中执行查询的数据库。
fn get_length(head: &Option<Box<ListNode>>) -> usize {
let mut res = 0;
let mut current_node = head;
while current_node.is_some() {
current_node = ¤t_node.as_ref().unwrap().next;
res += 1;
}
res
}
fn split(mut head: Option<Box<ListNode>>, len: usize) -> (Option<Box<ListNode>>, Option<Box<ListNode>>) {
let mut curr = head.take();
for _ in 0..len {
let mut curr_inner = curr.unwrap();
curr = curr_inner.next.take();
}
(head, curr.take())
}
let len = get_length(&node);
let (l1, l2) = split(node, len / 2 + len % 2);
这样,您就不会暴露安全性,并且可以相信数据库中的扩展名。
GL
答案 5 :(得分:0)
从Postgres 13开始,某些模块/扩展被认为是“受信任的”,并且可以由对当前数据库具有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-os / p>
要检查给定的模块是否合格,请访问https://www.postgresql.org/docs/13/contrib.html并选择有问题的模块。如果它被认为是“受信任的”,则页面将包含以下句子:
该模块被认为是“受信任的”,也就是说,可以由对当前数据库具有
CREATE
特权的非超级用户安装该模块。