使用 Rust 開發 PostgreSQL 儲存過程
阿新 • • 發佈:2018-12-16
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);
這就是全部了,簡單吧?
玩得開心!