1 个不稳定版本
0.1.0 | 2024 年 2 月 16 日 |
---|
在 数据库接口 中排名第 2522
17KB
54 行代码(不包括注释)
postgres-named-parameters
postgres-named-parameters
是围绕 postgres
包的轻量级宏包装器,它为您的原始 SQL 查询提供了命名参数的便捷性。在底层,您的命名参数在编译时被转换成编号参数。
使用示例
use postgres_from_row::FromRow;
use postgres_named_parameters::Query;
// Use the postgres-from-row crate to decode each row returned
// from a query into a struct.
#[derive(FromRow, Debug)]
struct Person {
first_name: String,
last_name: String,
hobby: Option<String>,
alive: bool,
}
// Use a struct to define a query. The #[derive(Query)] will implement
// query functions that handle passing in the parameters, and the named
// parameters are converted to numbered parameters ($1, $2,...) at compile
// time.
#[derive(Query)]
#[query(
// Write the query using named parameters
sql = "
SELECT *
FROM Person
WHERE (first_name = @name OR last_name = @name)
AND alive = @alive",
// Specify what type each row returned from the query should decode to
row = Person
)]
struct GetPeople<'a> {
// Define the query's parameters
alive: bool,
name: &'a str,
}
fn main() -> Result<(), postgres::Error> {
let connection_string = std::env::var("POSTGRES_CONNECTION_STRING")
.unwrap_or("host=localhost user=postgres".to_owned());
let mut db = postgres::Client::connect(&connection_string, postgres::NoTls)?;
// Execute the query
let people: Vec<Person> = GetPeople {
alive: true,
name: "John",
}
.query_all(&mut db)?;
// This roughly desugars to:
//
// let people: Vec<Person> = db.query(
// "SELECT *
// FROM Person
// WHERE (first_name = $2 OR last_name = $2)
// AND alive = $1",
// &[&true, &"John"],
// )?
// .iter()
// .map(Person::try_from_row)
// .collect::<Result<Vec<Person>,postgres::Error>>()?;
//
// Note that the #[derive(Query)] takes care of changing the SQL to use
// numbered parameters (i.e. $1, $2) at compile time.
println!("Found: {:?}", people);
Ok(())
}
有关更详细的示例(包括批量查询),请参阅 GitHub 仓库中的示例项目文件夹:GitHub 仓库。
特性
- 支持事务
- SQL 转换为编号参数发生在编译时
- 输入命名参数错误(例如,将
@naame
而不是@name
)会在编译时产生错误
归属 & 相关库
本库受到了以下库的启发
- couch/aykroyd 提供了将查询表示为结构体的想法
- nolanderc/rust-postgres-query 和 solidsnack/rust-postgres-named-parameters 在创建 SQL 解析器时被用作参考
- 3noch/postgres-simple-interpolate 是启发创建 Rust 中处理 SQL 参数的便捷方式的 Haskell 库
依赖
~8–17MB
~241K SLoC