23个版本 (7个稳定版本)
1.5.0 | 2022年4月8日 |
---|---|
1.4.0 | 2022年3月19日 |
0.11.1 | 2022年2月22日 |
0.9.1 | 2021年12月11日 |
0.8.0 | 2021年11月29日 |
#903 在 数据库接口
每月下载量:69
510KB
175 行
db_helpers
db_helpers 提供各种辅助工具,简化并使与数据库交互更安全。
这不是一个orm库,想法是简单地替换内联查询,并开始获得好处,而无需学习新的库。
为什么我创建了 db_helpers
- 查询中编译时检查字段名,使普通SQL更安全。
- 减少样板代码(为每个结构体创建From等)
功能
- 创建表创建和索引查询(功能标志)
- 通过实现某些默认功能(如将行转换为结构体的转换)来减少样板代码(功能标志)
- 编译时字段名验证
- 有意义的错误信息
用法
use db_helpers::{Table,Q};
#[derive(Table)]
//index is optional
//__TABLE__ key is automatically replaced with table_name
#[table(name = "users", index = "create unique index if not exists unique_usernames_of_users on __TABLE__ (username)")]
struct User
{
//if name is not specified lowercase fieldname is used by default
//q is mandatory
#[table(name = "id", q = "bigserial primary key not null")]
_id: i64,
//name of this field is assumed username
#[table( q = "text")]
username: String,
}
#[derive(Table)]
//index is optional
#[table(name = "ops")]
struct Op{
#[table(q="bigserial not null primary key")]
id:i64,
#[table(q="bigint not null references")]
user_id:i64,
}
db.batch_execure(
//Available if pg feature is enabled
[User::__pg_create_table_str(),User::__pg_index()].join(";")
).await;
//unfortunately for the time being `<struct>::{` part cannot contain spaces smarter parsing is in the todo list
let User:User = db.query_one(Q!("select User::{_id,username} from User::__TABLE__"),params!()).await.unwrap();
db.execute(Q!("insert into ( Foo::{username} ) VALUES ($1)"),params!("superman")).await.unwrap();
//you can also use tablename.fieldname format using > in the beginning of the field
//produces `select id , users.username from users`
let User:User = db.query_one(Q!("select User::{_id,>username} from User::__TABLE__"),params!()).await.unwrap();
let ops : Vec<Op> = db
.query(Q!("select * from Op::__TABLE__ where Op::{user_id} = (select Foo::{_id} from Foo::__TABLE__ where Foo::{username} = $1)"),
params!("superman"))
.await.unwrap().iter(Into::into).collect();
//it also supports runtime args using format macro
//if no additional arguments provided Q produces a &'static str otherwise it passes everything to format! macro
Q!(
"select Foo::{>username} from Foo::__TABLE__ where Foo::{>_id} in ({})",
["1", "2", "3"].join(",")
)
错误信息
如何升级到 0x 版本
请查看 变更日志 以获取详细信息
待办事项
- 允许在 Q 中使用格式化宏
- 添加对原始字符串字面量的支持
- *- 操作符表示所有字段,但不包括定义的字段
Users::{*-password}
- 尽可能从 Rust 类型推断出 PostgreSQL 类型,使
q
参数可选 - 更智能地解析
Q
,允许在更多位置使用空格以及在某些位置(如插入)不使用空格 - SQLite后端
依赖关系
~2–11MB
~121K SLoC