我想编写一个具有以下签名的函数:
fn delete_direct(pool: &Pool, q: T);
该函数可用于任意表:
use crate::schema::users::dsl::*;
delete_direct(&pool, users.filter(name.eq("Harry")))
替换用法:
use crate::schema::users::dsl::*;
let mut conn = &pool.get().expect("Failed to get database connection");
diesel::delete(users.filter(name.eq("Harry")))
.execute(&mut conn)
.expect("Failed to run the delete query you specified");
pool
这里是类型diesel::r2d2::Pool<ConnectionManager<PgConnection>>
,为了简洁起见,它别名为类型Pool
。
我最终得到了这个功能:
fn delete_direct<T>(pool: &Pool, q: T) where
T: diesel::query_builder::IntoUpdateTarget,
<T as diesel::associations::HasTable>::Table: diesel::query_builder::QueryId + 'static,
<T as diesel::query_builder::IntoUpdateTarget>::WhereClause: diesel::query_builder::QueryId + diesel::query_builder::QueryFragment<diesel::pg::Pg>,
<<T as diesel::associations::HasTable>::Table as QuerySource>::FromClause: diesel::query_builder::QueryFragment<diesel::pg::Pg>,
{
let mut conn = pool.get().expect("Failed to get database connection");
diesel::delete(q)
.execute(&mut conn)
.expect("Failed to run the delete query you specified");
}
在编译器的帮助下满足 diesel 期望存在的所有特征约束。
这看起来很复杂,而且我好像忽略了一些显而易见的东西。我忽略了一些显而易见的东西,还是这是实现此功能的最简单方法?
delete
通过模仿和的约束execute
,您可以将其简化为:但总体而言,对柴油碎片进行抽象很容易需要大量限制才能正确处理。我个人认为不值得这么麻烦。