Quero escrever uma função com a assinatura:
fn delete_direct(pool: &Pool, q: T);
Essa função pode ser usada para uma tabela arbitrária:
use crate::schema::users::dsl::*;
delete_direct(&pool, users.filter(name.eq("Harry")))
Para substituir o uso:
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
aqui é do tipo diesel::r2d2::Pool<ConnectionManager<PgConnection>>
, que é apelidado de type Pool
por questões de brevidade.
Acabei ficando com essa função:
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");
}
Com a ajuda do compilador para satisfazer todas as restrições de características que o diesel espera que estejam presentes.
Isso parece complexo e parece que estou esquecendo de algo óbvio. Estou esquecendo de algo óbvio ou essa é a maneira mais simples de implementar essa função?