#query #sql-query #postgresql #parameters #derive #define #null

postgres_query_derive

使用人类可读的参数名定义SQL查询

2个版本

0.1.1 2019年9月10日
0.1.0 2019年9月10日

#49 in #null

MIT/Apache

10KB
183 代码行

Rust Postgres Query

本库提供了一种特性和一个宏,允许在使用 rust-postgres 时在SQL查询中使用命名参数。

示例

use postgres_query::Query;
use postgres::{Connection, TlsMode, types::ToSql};

#[derive(Query)]
#[query(sql = "
    CREATE TABLE IF NOT EXISTS person (
         id              SERIAL PRIMARY KEY,
         name            VARCHAR NOT NULL,
         age             INTEGER
     )
")]
struct CreatePerson;

#[derive(Query)]
#[query(sql = "INSERT INTO person (name, age) VALUES ($name, $age)")]
struct InsertPerson<'a> {
    name: &'a str,
    age: Option<i32>,
}

#[derive(Query)]
#[query(sql = "SELECT id, name, age FROM person WHERE name = $first_name || ' ' || $last_name")]
struct NameQuery<'a> {
    first_name: &'a dyn ToSql,
    last_name: &'a str,
}

fn main() {
    let conn = Connection::connect("postgres://postgres@localhost:5432", TlsMode::None).unwrap();

    let create = CreatePerson;
    create.execute(&conn).unwrap();

    let insert = InsertPerson {
        name: "Cave Johnson",
        age: Some(23),
    };

    insert.execute(&conn).unwrap();

    let name = NameQuery {
        first_name: &"Cave",
        last_name: "Johnson"
    };

    for row in &name.query(&conn).unwrap() {
        let id: i32 = row.get("id");
        let name: String = row.get("name");
        let age: i32 = row.get("age");

        println!("Found person {}: {} age {}", id, name, age);
    }
}

许可证

在您的选择下,根据Apache许可证,版本2.0MIT许可证 授权。

除非您明确指出,否则您有意提交给 rust-postgres-query 的任何贡献,根据Apache-2.0许可证定义,将按上述方式双许可,不附加任何额外的条款或条件。

依赖关系

~6MB
~143K SLoC