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);
这就是全部了,简单吧?
玩得开心!