Database Rust-我可以让这个diesel dsl::find()函数更通用吗?
我有一个函数,它使用diesel根据给定ID从DB获取对象:Database Rust-我可以让这个diesel dsl::find()函数更通用吗?,database,generics,rust,rust-diesel,Database,Generics,Rust,Rust Diesel,我有一个函数,它使用diesel根据给定ID从DB获取对象: fn get_db_site(pool: web::Data<Pool>, site_id: u32) -> Result<Site, diesel::result::Error> { let conn = pool.get().unwrap(); dsl::site.fi
fn get_db_site(pool: web::Data<Pool>, site_id: u32) -> Result<Site, diesel::result::Error> {
let conn = pool.get().unwrap();
dsl::site.find(site_id).get_result::<Site>(&conn)
}
fn获取数据库站点(池:web::数据,站点id:u32)->结果{
让conn=pool.get().unwrap();
dsl::site.find(site_id).get_result::(&conn)
}
这个函数对于我想要运行它的每个表都是完全相同的,所以我希望把它放在它自己的utils文件中,这样我就不必每次都输入相同的内容。唯一的问题是为了找到我需要做的事
板条箱::模式::站点::dsl::站点。查找
,我不确定如何将该调用设置为泛型以接受任何类型。我知道有类型参数,但我认为这在这里不起作用我通常建议不要让diesel的东西更通用,因为这会很快导致非常复杂的特性界限。您通常不希望在应用程序代码中执行此操作。(对于需要通用的库来说,这是另一回事)。我通常将这种情况与普通SQL进行比较。例如,如果有人抱怨users::table.find(pk)
感觉像是重复的,那么问问自己以下问题:您是否觉得SELECT…FROM users
在相应的查询SELECT…FROM users,其中id=$
中重复了。(diesel dsl声明基本相同)
为了回答您的实际问题,通用函数需要如下所示:
(不确定我是否在未测试的情况下获得了所有边界)
fn get_db_thing(池:web::Data,主键:PK)->Result
其中T:Table+HasTable,
T:FindDsl,
U:可查询
{
让conn=pool.get().unwrap();
T::table().find(主键)。get_结果::(&conn)
}
正如您所看到的,trait边界列表已经比在相应函数中内联加载长得多。此外,在构造查询时添加的所有详细信息现在都需要作为泛型函数参数。至少编译器无法推断T
的类型,因此从代码大小的角度来看,该解决方案并不比不使其通用更“简单”