#database-table #queries #compile-time #macro #field-name #checked #helper

db-helpers

提供各种宏,帮助进行数据库查询和表格操作

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数据库接口

Download history 13/week @ 2024-03-30 2/week @ 2024-04-06

每月下载量:69

GPL-2.0 许可证

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(",")
	)

错误信息

invalid_struct missing_fields no_field missing_close

如何升级到 0x 版本

请查看 变更日志 以获取详细信息

待办事项

  • 允许在 Q 中使用格式化宏
  • 添加对原始字符串字面量的支持
  • *- 操作符表示所有字段,但不包括定义的字段 Users::{*-password}
  • 尽可能从 Rust 类型推断出 PostgreSQL 类型,使 q 参数可选
  • 更智能地解析 Q,允许在更多位置使用空格以及在某些位置(如插入)不使用空格
  • SQLite后端

依赖关系

~2–11MB
~121K SLoC