标签
PostgreSQL , UDF , 框架支持 , Django , mybatis , ibatis
背景
PostgreSQL 的功能非常的强大,以至于一些框架可能无法完全发挥出PG的功能。
不过现在活跃的框架对PG的支持越来越好了,例如Django,就有专门针对PG的模块,可以使用PG的JSON,索引接口等功能。
https://docs.djangoproject.com/en/2.0/search/?q=postgresql
那么在框架不支持某些PG特性时,有什么方法让它支持起来呢?
答案是UDF,没错调用UDF就可以用到这些特殊的功能了。
打个比方,PG支持9种索引,语法如下:
Command: CREATE INDEX
Description: define a new index
Syntax:
CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [ IF NOT EXISTS ] name ] ON table_name [ USING method ]
( { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] )
[ WITH ( storage_parameter = value [, ... ] ) ]
[ TABLESPACE tablespace_name ]
[ WHERE predicate ]
《自动选择正确索引访问接口(btree,hash,gin,gist,sp-gist,brin,bitmap...)的方法》
《Greenplum 最佳实践 - 什么时候选择bitmap索引》
而使用框架时,创建索引也许没有USING method的接口。
使用UDF就可以解决这个问题。
因为select function($parameter)
所有框架都支持。
例子
create or replace function f_crt_idx(name,name,name,name,text,name) returns void as $$
declare
sql text := format('create index %I on %I.%I using %s (%s) tablespace %s', $1,$2,$3,$4,$5,$6);
begin
raise notice '%', sql;
execute sql;
end;
$$ language plpgsql strict;
postgres=# select f_crt_idx('idx_a', 'public', 'a', 'btree', 'c1,c2', 'pg_default');
NOTICE: create index idx_a on public.a using btree (c1,c2) tablespace pg_default
f_crt_idx
-----------
(1 row)
小结
使用UDF,可以实现几乎所有的功能接口,使得任何框架都可以支持PG的所有功能。
参考
《自动选择正确索引访问接口(btree,hash,gin,gist,sp-gist,brin,bitmap...)的方法》