记录两个有用的pgrs为postgres写拓展的函数
use pgrx::prelude::*;
use serde::{Deserialize, Serialize};
::pgrx::pg_module_magic!();
#[pg_extern]
fn hello_first() -> &'static str {
"Hello, first"
}
#[derive(PostgresType, Serialize, Deserialize, Debug, Eq, PartialEq)]
pub struct A {
pub name: String,
}
// 返回一个自定义struct的vector
#[pg_extern]
#[search_path(@extschema@)]
fn return_mytype() -> Vec<A> {
let a1 = A {
name: "asdfa".to_string(),
};
let a2 = A {
name: "3333".to_string(),
};
vec![a1, a2]
}
// 数据库 wq有 table account,一列数据 value id 1, name asd
#[pg_extern]
fn return_table() -> Result<
TableIterator<
'static,
(
name!(id, i32),
name!(name, Option<String>),
name!(human_age, i32),
),
>,
spi::Error,
> {
/*
从account表格选择所有数据,另外单独配置一列human_age
*/
let query = "SELECT * FROM account;";
Spi::connect(|client| {
let mut results = Vec::new();
let tup_table = client.select(query, None, None)?;
for row in tup_table {
let id = row["id"].value::<i32>()?;
let name = row["name"].value::<String>()?;
let human_age = 7;
results.push((id.unwrap_or(0), name, human_age));
}
Ok(TableIterator::new(results))
})
}