22 个版本 (4 个重大更新)

0.5.2 2024年7月19日
0.5.1 2024年7月4日
0.4.3 2024年6月28日
0.3.3 2024年6月5日
0.1.1 2024年4月18日

#50#build-time

Download history 127/week @ 2024-04-10 253/week @ 2024-04-17 554/week @ 2024-04-24 492/week @ 2024-05-01 439/week @ 2024-05-15 27/week @ 2024-05-22 197/week @ 2024-05-29 352/week @ 2024-06-05 151/week @ 2024-06-12 121/week @ 2024-06-19 194/week @ 2024-06-26 258/week @ 2024-07-03 109/week @ 2024-07-17 89/week @ 2024-07-24

每月下载量458
2 个包中使用 (通过 geekorm)

MIT 协议

200KB
4.5K SLoC

GeekORM Derive

geekorm_derive 包是用于在构建时由 geekorm 使用的所有预处理 derive 宏。

默认功能

生成查询方法

默认情况下,为结构体生成以下方法:

  • create():创建查询
  • select():选择查询
  • all():选择表中的所有行
  • insert():插入查询
  • update():更新查询
  • count():计算行数

这些都是由 geekorm_core::QueryBuilderTrait 特性定义的。

use geekorm::{Table, PrimaryKeyInteger};
use geekorm::prelude::*;

#[derive(Table, Default)]
struct Users {
    id: PrimaryKeyInteger,
    name: String,
    age: i32,
    occupation: String,
}

// Create a new table query
let create = Users::query_create().build()
    .expect("Failed to build CREATE TABLE query");

// Select data from the table
let select = Users::query_select()
    .where_eq("name", "geekmasher")
    .build()
    .expect("Failed to build SELECT query");

// Create a default User
let mut user = Users::default();

// Insert data 
let insert = Users::query_insert(&user);

// Update query
user.name = String::from("42ByteLabs");
let update = Users::query_update(&user);

功能 - 自动生成新结构体函数

当启用 new 功能时,为结构体生成以下方法

  • PrimaryKey<T> 字段不会生成
  • Option<T> 字段不会生成
use geekorm::{Table, PrimaryKeyInteger};
use geekorm::prelude::*;

#[derive(Table)]
struct Users {
    id: PrimaryKeyInteger,
    name: String,
    age: i32,
    occupation: String,
    country: Option<String>,
}

let user = Users::new(
    String::from("geekmasher"),
    42,
    String::from("Software Developer")
);

功能 - 生成的辅助方法

当启用 helpers 功能时,为结构体生成以下辅助方法

注意: 这是一个非常实验性的功能,可能会在未来更改。

use geekorm::{Table, PrimaryKeyInteger};
use geekorm::prelude::*;

#[derive(Table)]
struct Users {
    id: PrimaryKeyInteger,
    name: String,
    age: i32,
    occupation: String,
}

// Select by column helper function
let user = Users::query_select_by_name("geekmasher");
# assert_eq!(user.query, String::from("SELECT id, name, age, occupation FROM Users WHERE name = ?;"));
let user = Users::query_select_by_age(42);
# assert_eq!(user.query, String::from("SELECT id, name, age, occupation FROM Users WHERE age = ?;"));
let user = Users::query_select_by_occupation("Software Developer");
# assert_eq!(user.query, String::from("SELECT id, name, age, occupation FROM Users WHERE occupation = ?;"));

功能 - 为列生成随机数据

当使用 rand 功能时,可以自动生成随机字符串并使用

# #[cfg(feature = "rand")]
# {
use geekorm::prelude::*;
use geekorm::{Table, PrimaryKeyInteger};

#[derive(Table, Debug)]
pub struct Users {
    id: PrimaryKeyInteger,
    name: String,
    #[geekorm(rand, rand_length = 42, rand_prefix = "token")]
    token: String
}

let mut user = Users::new(String::from("geekmasher"));
println!("{}", user.token);
# assert_eq!(user.token.len(), 48);

# let old_token = user.token.clone();
user.regenerate_token();
# assert_ne!(old_token, user.token);
# }

rand 属性

  • rand:将字符串字段设置为随机生成的值
  • rand_length:设置随机生成字符串的长度
    • 默认:32
  • rand_prefix:为随机生成的字符串设置前缀
    • 默认值:无

特性 - 为存储密码生成哈希值

使用 hash 特性时,您可以自动对密码进行哈希处理,以确保它们被安全存储。

# #[cfg(feature = "hash-sha512")]
# {
use geekorm::prelude::*;
use geekorm::{Table, PrimaryKeyInteger};

#[derive(Table, Debug)]
pub struct Users {
    id: PrimaryKeyInteger,
    username: String,

    #[geekorm(hash)]
#   // This config below is not the most secure algorithm, always use default ;) 
#   #[geekorm(hash_algorithm = "Sha512")]
    password: String,
}

# fn main() -> Result<(), geekorm::Error> {
let mut user = Users::new(String::from("geekmasher"), String::from("password"));
# assert_eq!(user.password.len(), 95);

// Update password
user.hash_password("newpassword");

// Verify password
if user.check_password("newpassword")? {
   println!("Password is correct");
} else {
   println!("Password is incorrect");
}

# Ok(())
# }
# }

hash 属性

  • hashpassword:将字符串字段设置为可哈希的值
  • hash_algorithm:设置要使用的算法
    • 默认值:Pbkdf2

依赖项

~1.7–3.5MB
~63K SLoC