一些例子 | 自述 |《diesel 中文文档》| rust 技术论坛-金年会app官方网
简单的查询是轻而易举的事。从数据库加载所有用户:
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 和从原始 sql映射。
这意味着你可以写这个:
#[derive(queryable)]
pub struct download {
id: i32,
version_id: i32,
downloads: i32,
counted: i32,
date: systemtime,
}
而不是这样:
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 *
diesel 的代码生成器可以生成几种更新记录的方法,使您能够以对应用程序有意义的方式封装逻辑。
修饰一个 struct
post.published = true;
post.save_changes(&mut connection);
一次性批量变更
update(users.filter(email.like("%@spammer.com")))
.set(banned.eq(true))
.execute(&mut connection)
使用 struct 封装
update(settings::belonging_to(current_user))
.set(&settings_form)
.execute(&mut connection)
总会有一些查询使用原始 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)?;