#sql-query #parameters #query-parameters #postgresql #query #sql #macro

postgres-named-parameters

在原始 SQL 查询中提供命名参数便捷性的轻量级宏包装器,围绕 postgres 包。

1 个不稳定版本

0.1.0 2024 年 2 月 16 日

数据库接口 中排名第 2522

MIT 许可证

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)会在编译时产生错误

归属 & 相关库

本库受到了以下库的启发

依赖

~8–17MB
~241K SLoC