При написании своих тестов я хотел бы иметь возможность внедрить соединение в запрос, чтобы я мог обернуть весь тестовый пример в транзакцию (даже если в тестовом примере есть более одного запроса).
Я попытался сделать это, используя BeforeMiddleware
, который я могу связать в своих тестовых примерах, чтобы вставить соединение, как таковое:
pub type DatabaseConnection = PooledConnection<ConnectionManager<PgConnection>>;
pub struct DatabaseOverride {
conn: DatabaseConnection,
}
impl BeforeMiddleware for DatabaseOverride {
fn before(&self, req: &mut Request) -> IronResult<()> {
req.extensions_mut().entry::<DatabaseOverride>().or_insert(self.conn);
Ok(())
}
}
Однако при попытке сделать это я сталкиваюсь с ошибкой компиляции:
error: the trait bound `std::rc::Rc<diesel::pg::connection::raw::RawConnection>: std::marker::Sync` is not satisfied [E0277]
impl BeforeMiddleware for DatabaseOverride {
^~~~~~~~~~~~~~~~
help: run `rustc --explain E0277` to see a detailed explanation
note: `std::rc::Rc<diesel::pg::connection::raw::RawConnection>` cannot be shared between threads safely
note: required because it appears within the type `diesel::pg::PgConnection`
note: required because it appears within the type `r2d2::Conn<diesel::pg::PgConnection>`
note: required because it appears within the type `std::option::Option<r2d2::Conn<diesel::pg::PgConnection>>`
note: required because it appears within the type `r2d2::PooledConnection<r2d2_diesel::ConnectionManager<diesel::pg::PgConnection>>`
note: required because it appears within the type `utility::db::DatabaseOverride`
note: required by `iron::BeforeMiddleware`
error: the trait bound `std::cell::Cell<i32>: std::marker::Sync` is not satisfied [E0277]
impl BeforeMiddleware for DatabaseOverride {
^~~~~~~~~~~~~~~~
help: run `rustc --explain E0277` to see a detailed explanation
note: `std::cell::Cell<i32>` cannot be shared between threads safely
note: required because it appears within the type `diesel::pg::PgConnection`
note: required because it appears within the type `r2d2::Conn<diesel::pg::PgConnection>`
note: required because it appears within the type `std::option::Option<r2d2::Conn<diesel::pg::PgConnection>>`
note: required because it appears within the type `r2d2::PooledConnection<r2d2_diesel::ConnectionManager<diesel::pg::PgConnection>>`
note: required because it appears within the type `utility::db::DatabaseOverride`
note: required by `iron::BeforeMiddleware`
Есть ли способ обойти это с соединениями дизеля? Я нашел несколько примеров на Github, чтобы сделать это с помощью ящика pg
, но я хотел бы продолжать использовать дизель.
typemap
или что-то подобное, чтобы иметь возможность хранить его в расширениях запроса? - person Simon Whitehead   schedule 24.06.2016BeforeMiddleware
сdiesel::pg::PgConnection
, потому чтоPgConnection
не реализуетSync
. Я надеялся, что кто-то знает обходной путь для этого ограничения. - person NeuroXc   schedule 24.06.2016diesel
, я не уверен. Однако тот факт, что он использует любой из типовCell
или даже несинхронизированный интеллектуальный указатель, такой какRc
, приведет к тому, что он автоматически не сможет реализоватьSync
. - person Simon Whitehead   schedule 24.06.2016