Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database Rust-我可以让这个diesel dsl::find()函数更通用吗?_Database_Generics_Rust_Rust Diesel - Fatal编程技术网

Database Rust-我可以让这个diesel dsl::find()函数更通用吗?

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

我有一个函数,它使用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.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
的类型,因此从代码大小的角度来看,该解决方案并不比不使其通用更“简单”