3个不稳定版本
0.2.1 | 2024年2月14日 |
---|---|
0.2.0 | 2024年1月31日 |
0.1.0 | 2024年1月30日 |
#29 in #query-builder
每月 22 次下载
51KB
1.5K SLoC
ryzz
ryzz是Rust中sqlite的自动迁移生成器和查询构建器。
- 自动追加迁移
- Sql-like语法
- 查询构建器不是orm
安装
cargo add ryzz
声明你的模式
use ryzz::*;
#[table("posts")]
struct Post {
#[ryzz(pk)]
id: i64,
title: Option<String>,
body: String
}
#[table]
struct Comment {
#[ryzz(pk)]
id: i64,
body: String,
#[ryzz(fk = "posts(id)")]
post_id: i64,
}
插入、更新和删除
let db = Database::new("db.sqlite3").await?;
let posts = Post::table(&db).await?;
let comments = Comment::table(&db).await?;
let post = Post {
id: 1,
title: None,
body: "".into()
};
// insert into posts (id, body) values (?, ?) returning *
let mut post: Post = db
.insert(posts)
.values(post)?
.returning()
.await?;
post.body = "post".into();
// update posts set body = ?, id = ? where id = ? returning *
let post: Post = db
.update(posts)
.set(post)?
.where_(and(eq(posts.id, 1), eq(posts.title, Value::Null)))
.returning()
.await?;
// delete from posts where id = ? returning *
let post: Post = db
.delete_from(posts)
.where_(eq(posts.id, 1))
.returning()
.await?;
查询
// select ... from Comment
let rows: Vec<Comment> = db
.select(())
.from(comments)
.all()
.await?;
// select ... from Comment
let rows: Vec<Comment> = db
.select((comments.id, comments.body))
.from(comments)
.all()
.await?;
连接
#[row]
struct CommentWithPost {
comment: Comment,
post: Post
}
// select ... from Comment inner join posts on posts.id = Comment.post_id
let rows = db
.select(())
.from(comments)
.inner_join(posts, eq(posts.id, comments.post_id))
.all::<CommentWithPost>()
.await?;
预处理语句
let query = db
.select(())
.from(comments);
let prepped = query.prep::<Comment>();
let rows: Vec<Comment> = prepped.all().await?;
管理索引
let ix = index("posts_id_body_ix")
.unique()
.on(posts, (posts.id, posts.body));
// create unique index if not exists posts_id_body_ix on posts (id, body);
db.create(&ix).await?;
// drop index if exists posts_id_body_ix;
db.drop(&ix).await?;
Sqlite到Rust类型映射
Sqlite | Rust |
---|---|
文本 | 字符串 |
整数 | i64 |
实数 | f64 |
空值 | None |
二进制大对象 | Vec<u8> |
自动迁移
- 模式迁移始终是
create table
或alter table add column
。受 trevyn/turbosql 启发 - 当调用
<Your Table>::table(&db).await?
时,运行迁移。
依赖项
~27MB
~511K SLoC