使用 Rust 开发 PostgreSQL 存储过程

  1. 云栖社区>
  2. PostgreSQL技术进阶>
  3. 博客>
  4. 正文

使用 Rust 开发 PostgreSQL 存储过程

clia 2018-12-16 10:40:44 浏览4797
展开阅读全文

pgxr

使用 Rust 来编写 PostgreSQL 的扩展函数(相当于存储过程)。

项目地址:
https://github.com/clia/pgxr

使用这个星球上最快的、高效、安全、有趣的编程语言,来为世界上功能最强大的开源关系数据库编写库内的程序!

试想,当你从数据库中查询出 1000 条记录用于程序处理时,当你的程序是数据库内的程序时,你根本无需将这 1000 条结果通过 PostgreSQL 的通讯协议走网络传输到应用程序里,在应用程序里分配这么大一块内存来装这些数据,再来进行处理。你可以直接读取数据库内这 1000 条结果的内存,在上面进行分析,直接进行逻辑处理或是返回结果!

又或者,你有一个复杂的逻辑,要查询出一些数据来,根据这些数据进行一些逻辑处理,然后还要更新一些数据,整个过程需要连接数据库次数达到数十次之多。如果你把程序写在数据库内,你只需要连接一次数据库!

通过把程序写在数据库内,你节省了应用程序所需要使用的内存,也节省了数据需要在网络间传输的时间。

而最适合用来进行这项工作的开发语言,应该就是 Rust 了!高性能、强表达能力、拒绝程序 BUG、无损耗 C 接口,让你的程序极速飞驰!同时让你的开发过程轻松愉悦

经测试,用 Rust 开发的存储过程比用 PL/pgSQL 开发的存储过程要快 30~40 倍之多!

代码示例

#[macro_use]
extern crate pgxr;

use pgxr::bindings::*;

PG_MODULE_MAGIC!();

PG_FUNCTION_INFO_V1!(pg_finfo_pgxr_example_add_one);

#[no_mangle]
pub extern "C" fn pgxr_example_add_one(fcinfo: FunctionCallInfo) -> Datum
{
    let num = try_return_int!(PG_GETARG_I32(fcinfo, 0));
    PG_RETURN_I32(num + 1)
}

使用方法

git clone https://github.com/clia/pgxr.git
cd pgxr/examples/pgxr_example_add_one
cargo build --release

然后运行 pg_config

找到 PKGLIBDIR,如 /usr/lib/postgresql/11/lib

sudo cp target/release/libpgxr_example_add_one.so /usr/lib/postgresql/11/lib
sudo su - postgres
psql
CREATE FUNCTION pgxr_example_add_one(integer) RETURNS integer
     AS 'libpgxr_example_add_one.so', 'pgxr_example_add_one'
     LANGUAGE C STRICT;
select pgxr_example_add_one(1);

这就是全部了,简单吧?

玩得开心!

网友评论

登录后评论
0/500
评论
clia
+ 关注
所属云栖号: PostgreSQL技术进阶