Я пытаюсь использовать общие функции Diesel для сокращения повторяющихся задач, таких как удаление строки на основе первичного ключа.
Я получил общую вставку строк, работающую относительно быстро, но запросы на удаление кажутся довольно сложными. Я попытался решить обе проблемы, используя find()
и filter()
. Я также консультировался по схожим темам 1 и 2 , но безуспешно.
Использование find
use diesel::prelude::*;
use diesel::query_dsl::methods::FindDsl;
use std::error::Error;
pub struct DB {
conn: SqliteConnection,
}
impl DB {
pub fn remove_row<'a, T>(&self, table: T, pk: &'a str) -> Result<(), Box<Error>>
where
T: FindDsl<&'a str>,
<T as FindDsl<&'a str>>::Output: diesel::Identifiable,
<T as FindDsl<&'a str>>::Output: diesel::associations::HasTable,
{
diesel::delete(table.find(pk)).execute(&self.conn)?;
Ok(())
}
}
Это приводит к следующей ошибке, которую я вообще не могу интерпретировать:
error[E0275]: overflow evaluating the requirement `_: std::marker::Sized`
--> src/db/mod.rs:103:3
|
103 | diesel::delete (table.find (pk)) .execute (&self.conn) ?;
| ^^^^^^^^^^^^^^
|
= help: consider adding a `#![recursion_limit="128"]` attribute to your crate
= note: required because of the requirements on the impl of `diesel::query_dsl::filter_dsl::FilterDsl<_>` for `<<<T as diesel::query_dsl::filter_dsl::FindDsl<&'a str>>::Output as diesel::associations::HasTable>::Table as diesel::query_builder::AsQuery>::Query`
= note: required because of the requirements on the impl of `diesel::query_builder::IntoUpdateTarget` for `<T as diesel::query_dsl::filter_dsl::FindDsl<&'a str>>::Output`
= note: required by `diesel::delete`
Использование filter()
use diesel::prelude::*;
use diesel::query_dsl::methods::FilterDsl;
use std::error::Error;
pub struct DB {
conn: SqliteConnection,
}
impl DB {
pub fn remove_row<T>(&self, table: T, pk: &str) -> Result<(), Box<Error>>
where
T: FilterDsl<bool>,
<T as FilterDsl<bool>>::Output: diesel::Identifiable,
<T as FilterDsl<bool>>::Output: diesel::associations::HasTable,
{
diesel::delete(table.filter(id.eq(pk))).execute(&self.conn)?;
Ok(())
}
}
В дополнение к предыдущей ошибке, здесь есть сообщение об ошибке: id
неизвестно в структуре данных. Я могу вспомнить одну недостающую черту, которая гарантирует существование этого ряда, но я ничего не нашел о таком поведении.
error[E0425]: cannot find value `id` in this scope
--> src/db/mod.rs:117:33
|
117 | diesel::delete (table.filter (id.eq (pk))) .execute (&self.conn) ?;
| ^^ not found in this scope
help: possible candidates are found in other modules, you can import them into scope
|
4 | use crate::db::schema::events::columns::id;
|
4 | use crate::db::schema::ignored_events::columns::id;
|
4 | use crate::db::schema::locations::columns::id;
|
4 | use std::process::id;
error[E0275]: overflow evaluating the requirement `_: std::marker::Sized`
--> src/db/mod.rs:117:3
|
117 | diesel::delete (table.filter (id.eq (pk))) .execute (&self.conn) ?;
| ^^^^^^^^^^^^^^
|
= help: consider adding a `#![recursion_limit="128"]` attribute to your crate
= note: required because of the requirements on the impl of `diesel::query_dsl::filter_dsl::FilterDsl<_>` for `<<<T as diesel::query_dsl::filter_dsl::FilterDsl<bool>>::Output as diesel::associations::HasTable>::Table as diesel::query_builder::AsQuery>::Query`
= note: required because of the requirements on the impl of `diesel::query_builder::IntoUpdateTarget` for `<T as diesel::query_dsl::filter_dsl::FilterDsl<bool>>::Output`
= note: required by `diesel::delete`