#query #dynamo-db #attributes #derive #abstraction #key #nitroglycerin

nitroglycerin_derive

为 nitroglycerin/dynamodb 实现 derive(Attributes, Get, Query)

8个不稳定版本 (3个破坏性更改)

0.4.2 2021年8月3日
0.4.1 2021年8月2日
0.4.0 2021年7月21日
0.3.0 2021年7月20日
0.1.0 2021年7月19日

#55#dynamo-db

每月下载量32次
用于 nitroglycerin

MIT 许可证

39KB
907

nitroglycerin

在 dynamodb 上的类型安全抽象

nitroglycerin crate nitroglycerin docs

use nitroglycerin::{Attributes, Key, Query, Table, DynamoDb, dynamodb::DynamoDbClient};
use rusoto_core::Region;

#[derive(Debug, PartialEq, Attributes, Key, Query)]
struct Employee {
    #[nitro(partition_key)]
    id: String,
    #[nitro(rename = "firstName")]
    name: String,
    joined: i64,
    left: Option<i64>,
}

impl Table for Employee {
    fn table_name() -> String {
        "Employees".to_string()
    }
}

#[derive(Debug, PartialEq, Attributes, Query)]
struct EmployeeNameIndex {
    #[nitro(partition_key, rename = "firstName")]
    name: String,
    #[nitro(sort_key)]
    joined: i64,
}

impl IndexTable for EmployeeNameIndex {
    type Table = Employees;
    fn index_name() -> Option<String> {
        Some("EmployeeNamesIndex".to_string())
    }
}

let client = DynamoDbClient::new(Region::default());

let employee: Option<Employee> = client.get::<Employee>()
    .id("emp_1") // get the employee with id "emp_1"
    .execute().await?;

let new_employee = Employee {
    id: "emp_1234".into(),
    name: "Conrad".into(),
    joined: 1626900000,
    left: None,
};
// Put the new employee item into the db
client.put(new_employee).execute().await?;

let employees: Vec<EmployeeNameIndex> = client.query::<EmployeeNameIndex>()
    .name("John") // query the db for all employees named "John"
    .execute().await?;

let employees: Vec<EmployeeNameIndex> = client.query::<EmployeeNameIndex>()
    .name("John") // query the db for all employees named "John"
    .joined().between(1626649200, 1626735600) // and who joined between 2021-07-19 and 2021-07-20
    .execute().await?;

依赖

~1.5MB
~36K SLoC