1. 程式人生 > >使用 Rust 開發 PostgreSQL 儲存過程

使用 Rust 開發 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);

這就是全部了,簡單吧?

玩得開心!