#query-builder #sqlite #database-schema #orm #db #drizzle

ryzz

A sqlite查询构建器和自动模式迁移器。不要称其为orm

3个不稳定版本

0.2.1 2024年2月14日
0.2.0 2024年1月31日
0.1.0 2024年1月30日

#29 in #query-builder

每月 22 次下载

MIT 许可证

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 tablealter table add column。受 trevyn/turbosql 启发
  • 当调用 <Your Table>::table(&db).await? 时,运行迁移。

依赖项

~27MB
~511K SLoC