如何修改postgresql的search_path以及限定其作用范围

在使用django时,如果某个表格明明存在,但是django报错“xxx” relation does not exist时,这是因为django默认搜索的schema模式为public,熟悉的同学都知道可以在django工程setting.py里添加search_path来解决。

1
2
3
4
5
6
7
8
9
10
11
12
13
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
# 'OPTIONS': {
# 'options': '-c search_path=public,opr,biz'
# },
'NAME': 'xxx',
'USER': 'xxx',
'PASSWORD': 'xxx',
'HOST': '127.0.0.1',
'PORT': '6543',
},
}

其实,除了这一种方式外,不经过django也可以在postgresql中直接指定search_path

1. 作用于全局范围

修改postgresql.conf文件,改默认的search_path = "$user",public为, 然后重启

search_path = 'blarg,public'

2. 针对某个数据库进行限定

ALTER DATABASE test SET search_path = blarg,public;

3. 针对某个用户名进行限定

ALTER ROLE foo SET search_path = blarg,public;

4. 同时针对用户名和数据库限定(推荐),因为这种方式最可控,不会出现意外情况

ALTER ROLE foo IN DATABASE test SET search_path = blarg,public;

同理,使用pgbouncer做 中间缓冲层的同学,因为貌似pgbouncer不支持django中search_path的设定,会报错djxdjango.db.utils.OperationalError: ERROR: Unsupported startup parameter: options不支持上文中的options选项,所以,就能使用上面推荐的第4种方式在postgres中直接设定search_path。经过试用,木有出现问题,欢迎留言沟通交流。

​ 参考文献: