PostgreSQL 9.6新手求助:如何移除查询中的pg_catalog约束?
移除PostgreSQL查询中的
pg_catalog限定符 嘿,刚接触PostgreSQL 9.6的话,能写出这样的查询已经很棒了!关于移除pg_catalog约束这事儿,其实很简单,我给你一步步说清楚:
为什么会有pg_catalog?
pg_catalog是PostgreSQL的系统模式,内置的文本搜索配置(比如你用的russian)就放在这里。默认情况下,PostgreSQL的搜索路径已经包含了pg_catalog,所以大部分时候我们可以直接省略这个前缀。
具体修改步骤
1. 直接省略pg_catalog.前缀
如果你的数据库默认搜索路径没被修改过(这是绝大多数情况),直接把pg_catalog.russian改成russian就行。PostgreSQL会自动在系统模式里找到对应的文本搜索配置。
修改后的查询示例:
select * from ( select "posts".* from "posts" inner join "feeds" on posts.destination_feed_ids # feeds.id > 0 and feeds.name='Posts' inner join "users" on feeds.user_id=users.uid and not users.is_private where to_tsvector('russian', posts.body) @@ to_tsquery('russian', 'xxx') union select "posts".* from "posts" inner join "feeds" on posts.destination_feed_ids # feeds.id > 0 and feeds.name='Pos...' ) as combined_posts;
2. (可选)设置默认文本搜索配置
如果你的查询经常用到俄语文本搜索,可以把数据库的默认配置改成俄语,这样连russian参数都能省略:
-- 替换成你的数据库名称 ALTER DATABASE your_db_name SET default_text_search_config = 'pg_catalog.russian';
执行完后需要重新连接数据库生效,之后查询可以简化成:
where to_tsvector(posts.body) @@ to_tsquery('xxx')
注意事项
- 如果之后你自己创建了同名的
russian文本搜索配置(自定义的),PostgreSQL会优先使用自定义的,而不是系统内置的。如果想避免这种情况,要么给自定义配置起不同的名字,要么必要时还是保留pg_catalog.前缀。 - 要是你的数据库被修改过搜索路径(移除了
pg_catalog),省略前缀会报错。这时候可以用show search_path;查看当前搜索路径,若确实没有pg_catalog,可以用SET search_path TO pg_catalog, public;临时添加,或者修改数据库默认搜索路径。
内容的提问来源于stack exchange,提问作者Karlom
相关产品推荐
相关产品推荐

