文章目录

PostgreSQL可以支持多种存储过程语言,官方支持的除了PL/pgSQL,还有TCL,Perl,Python。

本文使用源码安装PL/Python过程语言支持,并简介PL/Python的一些简单的入门。如果是使用安装包安装的话,可以参考1

参考PostgreSQL的官方文档,使用源码安装的时候,需要在之前编译的时候就启用--with-python选项。

1
2
3
Note: 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

1
test=# create extension plpythonu;

由于Python有Python2和Python3两个版本,以上是使用默认的Python,也就是Python2。如果需要指明是哪个Python版本,可以将上述命令中的plpythonu替换成plpython2uplpython3u

然后可以在psql中创建PL/Python的存储过程,如下

1
2
3
4
5
6
7
8
9
10
CREATE 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
7
test=# select pyfib(3) as i;
i
---
1
1
2
(3 rows)

如果不需要PL/Python了,可以将这个扩展drop掉,

1
test=# drop extension plpythonu;

可以看到提示,已经有function依赖了这个扩展,需要先将function先drop掉,或者使用DROP...CASCADE选项。如果drop function的话,需要注意,要把function的参数也加上,否则会报错,因为PostgreSQL是可以重载函数的,不同的参数但是拥有相同的函数名是合法的,被认为是不同的函数。drop所有的PL/Python的过程之后,就可以成功drop extension了。

1
test=# drop function pyfib(bigint);

以上是PL/Python的安装和使用基础。本文参考了2,还有PostgreSQL 9.3官方文档34,以及8.1中文版文档5的对应章节。

文章目录

欢迎来到Valleylord的博客!

本博的文章尽量原创。