开发者社区> clia> 正文

使用 Rust 开发 PostgreSQL 存储过程

简介: pgxr 使用 Rust 来编写 PostgreSQL 的扩展函数(相当于存储过程)。 项目地址:https://github.com/clia/pgxr 使用这个星球上最快的、高效、安全、有趣的编程语言,来为世界上功能最强大的开源关系数据库编写库内的程序! 试想,当你从数据库中查询出 1000 条记录用于程序处理时,当你的程序是数据库内的程序时,你根本无需将这 1000 条结果通过 PostgreSQL 的通讯协议走网络传输到应用程序里,在应用程序里分配这么大一块内存来装这些数据,再来进行处理。
+关注继续查看

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);

这就是全部了,简单吧?

玩得开心!

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
SQL使用链接服务器执行远程数据库上的存储过程
原文:SQL使用链接服务器执行远程数据库上的存储过程   --创建链接服务器 exec sp_addlinkedserver'server_tmp','','SQLOLEDB','远程服务器名或ip地址' exec sp_addlinkedsrvlogin'server_tmp','fa...
1275 0
MySQL开发篇,存储引擎的选择真的很重要吗?
MySQL开发篇,存储引擎的选择真的很重要吗? 谁说MySQL查询千万级别的数据很拉跨?我今天就要好好的和你拉拉家常,畅谈到深夜,一起过除夕!这篇文章也是年前的最后一篇,希望能带给大家些许收获,不知不觉查找文档和参考实体书籍就写了这么多,自己都感觉到意外。不禁感慨到,知道的越多,才知道不知道的更多。 开发人员或者是DBA都应该关注MySQL使用的存储引擎,选择合适存储引擎对你的应用性能提升是明显的。在阅读到本文的时候,肯定是有一定的MySQL或者其它数据库基础的,不然有些地方看着会很费劲。重点地方,我都进行了加粗处理,这样更容易获取关键知识点。
41 0
Sql Server 存储过程使用技巧
1、创建带Try。。。Catch的存储过程模板   Copy下面的代码,然后新建查询,就可以写sql语句,执行完后,一个你自己的存储过程就建立好了! USE [DB]--设定对应的数据库 GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER O...
765 0
【iOS开发】如何将 Array 存储在本地
做开发的时候,我们经常需要将数据保存在plist文件中,用这种方式来将数据写入磁盘,这样退出 App 再打开的话,上次写入的文件还在。 常用的方法是这个 func  writeToFile(path:String, atomically useAuxi...
675 0
阿里云文件存储NAS开发测试环境最佳实践
阿里云文件存储NAS开发测试环境最佳实践
2015 0
表格存储 Node.js SDK 开发入门
本文将结合电商订单场景为例,介绍表格存储 Tablestore Node.js SDK 的基本使用方法。
95 0
Castle.ActiveRecord 使用 存储过程 返回实体类
Castle,ActiveRecord,使用,存储过程,实体类 这几日就在研究这个问题 寻遍网上,也没找到个解决方法只有在NHibernate里执行存储过程 里面操作NHibernate的一点方法 于是动手写成了以下这个类 当然,只能保证测试可以通过,可能还有很多问题,要一个一个解决  1namespace ChAlumna.
749 0
+关注
clia
全栈 架构师 程序 建造师 训练师
9
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载