文章目录
PostgreSQL可以支持多种存储过程语言,官方支持的除了PL/pgSQL,还有TCL,Perl,Python。
本文使用源码安装PL/Python过程语言支持,并简介PL/Python的一些简单的入门。如果是使用安装包安装的话,可以参考1。
参考PostgreSQL的官方文档,使用源码安装的时候,需要在之前编译的时候就启用--with-python选项。
1
2
3Note: Users of source packages must specially enable the build of PL/Python during the installation process. (Refer to the installation instructions for more information.) Users of binary packages might find PL/Python in a separate subpackage.
注意: 使用源码包的用户必须在安装过程中声明打开 PL/Python 的制作。 (请参考安装指导获取更多信息。)二进制包的用户可能会在独立的子包中找到 PL/Python。
PostgreSQL的编译安装可以参考我之前的博客,这里和这里。先做PostgreSQL的configure,
1[postgres@anzhy postgresql]$ ./configure --prefix=$HOME/postgres --enable-depend --enable-cassert --enable-debug --with-python
运行结果提示有错,找不到Python.h,需要安装python-devel。
之后再configure就正常了,之后的步骤就是一般的用源码安装PostgreSQL的步骤,不再赘述。
安装之后启动PostgreSQL,然后需要注册plpythonu这个语言扩展,根据官方文档,可以用以下两种等价的方法。一种是在命令行下运行createlang
1[postgres@anzhy ~]$ createlang plpythonu test
上面的test参数表示数据库名,即在test数据库上启用plpythonu。还有一种是用psql登陆数据库之后运行create extension,
1test=# create extension plpythonu;
由于Python有Python2和Python3两个版本,以上是使用默认的Python,也就是Python2。如果需要指明是哪个Python版本,可以将上述命令中的plpythonu替换成plpython2u或plpython3u。
然后可以在psql中创建PL/Python的存储过程,如下
1
2
3
4
5
6
7
8
9
10CREATE OR REPLACE FUNCTION pyfib(n bigint)
RETURNS SETOF bigint
AS $$
a, b = 0, 1
fibnum = []
while b < n:
fibnum.append(b)
a, b = b, a+b
return fibnum
$$ LANGUAGE plpythonu;
如果之前的操作都正确,可以看到提示成功,
如果有问题的话,可以看到提示错误,plpythonu语言找不到,需要重新检查之前的操作,
创建的函数是用于计算fibonacci序列,可以试着运行一下,
1
2
3
4
5
6
7test=# select pyfib(3) as i;
i
---
1
1
2
(3 rows)
如果不需要PL/Python了,可以将这个扩展drop掉,
1test=# drop extension plpythonu;
可以看到提示,已经有function依赖了这个扩展,需要先将function先drop掉,或者使用DROP...CASCADE选项。如果drop function的话,需要注意,要把function的参数也加上,否则会报错,因为PostgreSQL是可以重载函数的,不同的参数但是拥有相同的函数名是合法的,被认为是不同的函数。drop所有的PL/Python的过程之后,就可以成功drop extension了。
1test=# drop function pyfib(bigint);
以上是PL/Python的安装和使用基础。本文参考了2,还有PostgreSQL 9.3官方文档3,4,以及8.1中文版文档5的对应章节。