75 个版本 (36 个稳定版本)
新 2.2.3 | 2024 年 8 月 23 日 |
---|---|
2.2.2 | 2024 年 7 月 19 日 |
2.2.1 | 2024 年 6 月 13 日 |
2.1.5 | 2024 年 3 月 15 日 |
0.2.0 | 2015 年 11 月 30 日 |
在 数据库接口 中排名 4
每月下载量 356,961
用于 474 个包 (399 个直接使用)
2MB
36K SLoC
为 Rust 提供安全、可扩展的 ORM 和查询构建器
API 文档:[最新发布版本](https://docs.rs/diesel) – [master 分支](https://docs.diesel.rs/master/diesel/index.html)
Diesel 移除了数据库交互的样板代码,消除了运行时错误,而没有牺牲性能。它充分利用 Rust 的类型系统,创建了一个低开销的查询构建器,感觉就像 Rust。
支持的数据库
您可以在 Cargo.toml
中配置数据库后端
[dependencies]
diesel = { version = "<version>", features = ["<postgres|mysql|sqlite>"] }
入门
在我们的详细入门教程中找到更多信息:[入门指南](https://diesel.rs/guides/getting-started)。更多特定功能的指南即将推出。
寻求帮助
如果您遇到问题,Diesel 在 Gitter 上有一个非常活跃的房间。您可以在 gitter.im/diesel-rs/diesel 上寻求帮助。对于更长时间的问题和关于 Diesel 将来的讨论,请打开 GitHub Discussions 上的讨论。
使用
简单查询
简单查询非常简单。从数据库中加载所有用户
users::table.load(&mut connection)
执行的 SQL
SELECT * FROM users;
加载某个用户的帖子
Post::belonging_to(user).load(&mut connection)
执行的 SQL
SELECT * FROM posts WHERE user_id = 1;
复杂查询
Diesel 强大的查询构建器可以帮助您构建您需要的简单或复杂的查询,零成本。
let versions = Version::belonging_to(krate)
.select(id)
.order(num.desc())
.limit(5);
let downloads = version_downloads
.filter(date.gt(now - 90.days()))
.filter(version_id.eq_any(versions))
.order(date)
.load::<Download>(&mut conn)?;
执行的 SQL
SELECT version_downloads.*
WHERE date > (NOW() - '90 days')
AND version_id = ANY(
SELECT id FROM versions
WHERE crate_id = 1
ORDER BY num DESC
LIMIT 5
)
ORDER BY date
减少样板代码
Diesel 代码生成器为您生成样板代码。它让您专注于业务逻辑,而不是映射 SQL 行。
这意味着您可以用这个
#[derive(Queryable, Selectable)]
#[diesel(table_name = downloads)]
pub struct Download {
id: i32,
version_id: i32,
downloads: i32,
counted: i32,
date: SystemTime,
}
而不是这个(没有 Diesel)
pub struct Download {
id: i32,
version_id: i32,
downloads: i32,
counted: i32,
date: SystemTime,
}
impl Download {
fn from_row(row: &Row) -> Download {
Download {
id: row.get("id"),
version_id: row.get("version_id"),
downloads: row.get("downloads"),
counted: row.get("counted"),
date: row.get("date"),
}
}
}
插入数据
这不仅仅关于读取数据。Diesel 使您可以使用结构体轻松创建新记录。
#[derive(Insertable)]
#[diesel(table_name = users)]
struct NewUser<'a> {
name: &'a str,
hair_color: Option<&'a str>,
}
let new_users = vec![
NewUser { name: "Sean", hair_color: Some("Black") },
NewUser { name: "Gordon", hair_color: None },
];
insert_into(users)
.values(&new_users)
.execute(&mut connection);
执行的 SQL
INSERT INTO users (name, hair_color) VALUES
('Sean', 'Black'),
('Gordon', DEFAULT)
如果您需要从插入的行中获取数据,只需将 execute
更改为 get_result
或 get_results
。Diesel 会处理其余部分。
let new_users = vec![
NewUser { name: "Sean", hair_color: Some("Black") },
NewUser { name: "Gordon", hair_color: None },
];
let inserted_users = insert_into(users)
.values(&new_users)
.get_results::<User>(&mut connection);
执行的 SQL
INSERT INTO users (name, hair_color) VALUES
('Sean', 'Black'),
('Gordon', DEFAULT)
RETURNING *
更新数据
柴油的代码生成器可以生成多种更新行的方法,让您以对您的应用程序有意义的方式封装您的逻辑。
修改结构体
post.published = true;
post.save_changes(&mut connection);
一次性批量更改
update(users.filter(email.like("%@spammer.com")))
.set(banned.eq(true))
.execute(&mut connection)
使用结构体进行封装
update(Settings::belonging_to(current_user))
.set(&settings_form)
.execute(&mut connection)
原始SQL
总会有一些查询直接用原始SQL编写更容易,或者不能用查询构建器表示。即使在这些情况下,Diesel也提供了一个易于使用的API来编写原始SQL。
#[derive(QueryableByName)]
#[diesel(table_name = users)]
struct User {
id: i32,
name: String,
organization_id: i32,
}
// Using `include_str!` allows us to keep the SQL in a
// separate file, where our editor can give us SQL specific
// syntax highlighting.
sql_query(include_str!("complex_users_by_organization.sql"))
.bind::<Integer, _>(organization_id)
.bind::<BigInt, _>(offset)
.bind::<BigInt, _>(limit)
.load::<User>(&mut conn)?;
行为准则
任何与Diesel有任何互动的人,包括但不限于这个GitHub仓库,都必须遵守我们的行为准则。
许可证
许可以下任一项
- Apache许可证第2版,(LICENSE-APACHE或https://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT或https://opensource.org/licenses/MIT)
贡献
在贡献之前,请阅读贡献指南,了解有关在本地设置Diesel、编码风格和常见缩写的有用信息。
除非您明确说明,否则您故意提交的任何贡献,根据Apache-2.0许可证的定义,将作为上述双重许可,不附加任何其他条款或条件。
依赖关系
~0.7-26MB
~443K SLoC