I have been working with Diesel a bit using it's PgConnection
directly, and I'm trying to actually get a connection pool hooked up via R2D2, but I've run into an error that I can't seem to get around:
the trait `r2d2_postgres::postgres::tls::MakeTlsConnect<r2d2_postgres::postgres::Socket>` is not implemented for `postgres::NoTls`
When trying to instantiate an r2d2_postgres::PostgresConnectionManager
like:
PostgresConnectionManager::new(database_url.parse().unwrap(), postgres::tls::NoTls);
I finally just made a new Rust project to run the example code in the README
that I was using as my guide, but it seems to be failing with the same error. My standalone project's dependencies
block looks like:
[dependencies]
r2d2 = "0.8.9"
r2d2_postgres = "0.16.0"
postgres = "0.18.1"
and my src/main.rs
looks like this (ripped straight from this project's README
):
use postgres::{Client, NoTls};
use r2d2_postgres::PostgresConnectionManager;
use std::thread;
fn main() {
let manager =
PostgresConnectionManager::new("host=localhost user=postgres".parse().unwrap(), NoTls);
let pool = r2d2::Pool::new(manager).unwrap();
for i in 0..10i32 {
let pool = pool.clone();
thread::spawn(move || {
let mut client = pool.get().unwrap();
client
.execute("INSERT INTO foo (bar) VALUES ($1)", &[&i])
.unwrap();
});
}
}
Running cargo build
results in the following rather lengthy set of errors. You can see the same trait implementation error in this near the top:
Compiling test-postgres v0.1.0 (/home/dpetersen/dev/test-postgres)
warning: unused import: `Client`
--> src/main.rs:1:16
|
1 | use postgres::{Client, NoTls};
| ^^^^^^
|
= note: `#[warn(unused_imports)]` on by default
error[E0277]: the trait bound `postgres::NoTls: r2d2_postgres::postgres::tls::MakeTlsConnect<r2d2_postgres::postgres::Socket>` is not satisfied
--> src/main.rs:7:89
|
7 | PostgresConnectionManager::new("host=localhost user=postgres".parse().unwrap(), NoTls);
| ^^^^^ the trait `r2d2_postgres::postgres::tls::MakeTlsConnect<r2d2_postgres::postgres::Socket>` is not implemented for `postgres::NoTls`
|
= note: required by `r2d2_postgres::PostgresConnectionManager::<T>::new`
error[E0277]: the trait bound `postgres::NoTls: r2d2_postgres::postgres::tls::MakeTlsConnect<r2d2_postgres::postgres::Socket>` is not satisfied
--> src/main.rs:8:32
|
8 | let pool = r2d2::Pool::new(manager).unwrap();
| ^^^^^^^ the trait `r2d2_postgres::postgres::tls::MakeTlsConnect<r2d2_postgres::postgres::Socket>` is not implemented for `postgres::NoTls`
|
= note: required because of the requirements on the impl of `r2d2::ManageConnection` for `r2d2_postgres::PostgresConnectionManager<postgres::NoTls>`
= note: required by `r2d2::Pool::<M>::new`
error[E0277]: the trait bound `postgres::NoTls: r2d2_postgres::postgres::tls::MakeTlsConnect<r2d2_postgres::postgres::Socket>` is not satisfied
--> src/main.rs:8:16
|
8 | let pool = r2d2::Pool::new(manager).unwrap();
| ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `r2d2_postgres::postgres::tls::MakeTlsConnect<r2d2_postgres::postgres::Socket>` is not implemented for `postgres::NoTls`
|
::: /home/dpetersen/.cargo/registry/src/github.com-1ecc6299db9ec823/r2d2-0.8.9/src/lib.rs:319:8
|
319 | M: ManageConnection;
| ---------------- required by this bound in `r2d2::Pool`
|
= note: required because of the requirements on the impl of `r2d2::ManageConnection` for `r2d2_postgres::PostgresConnectionManager<postgres::NoTls>`
error[E0599]: no method named `clone` found for struct `r2d2::Pool<r2d2_postgres::PostgresConnectionManager<postgres::NoTls>>` in the current scope
--> src/main.rs:11:25
|
11 | let pool = pool.clone();
| ^^^^^ method not found in `r2d2::Pool<r2d2_postgres::PostgresConnectionManager<postgres::NoTls>>`
|
::: /home/dpetersen/.cargo/registry/src/github.com-1ecc6299db9ec823/r2d2_postgres-0.16.0/src/lib.rs:37:1
|
37 | pub struct PostgresConnectionManager<T> {
| --------------------------------------- doesn't satisfy `_: r2d2::ManageConnection`
|
::: /home/dpetersen/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/clone.rs:122:8
|
122 | fn clone(&self) -> Self;
| -----
| |
| the method is available for `std::sync::Arc<r2d2::Pool<r2d2_postgres::PostgresConnectionManager<postgres::NoTls>>>` here
| the method is available for `std::rc::Rc<r2d2::Pool<r2d2_postgres::PostgresConnectionManager<postgres::NoTls>>>` here
|
::: /home/dpetersen/.cargo/registry/src/github.com-1ecc6299db9ec823/r2d2-0.8.9/src/lib.rs:317:1
|
317 | / pub struct Pool<M>(Arc<SharedPool<M>>)
318 | | where
319 | | M: ManageConnection;
| |________________________- doesn't satisfy `_: std::clone::Clone`
|
= note: the method `clone` exists but the following trait bounds were not satisfied:
`r2d2_postgres::PostgresConnectionManager<postgres::NoTls>: r2d2::ManageConnection`
which is required by `r2d2::Pool<r2d2_postgres::PostgresConnectionManager<postgres::NoTls>>: std::clone::Clone`
error: aborting due to 4 previous errors; 1 warning emitted
Some errors have detailed explanations: E0277, E0599.
For more information about an error, try `rustc --explain E0277`.
error: could not compile `test-postgres`.
To learn more, run the command again with --verbose.
I am running everything locally at the moment and so I can't use TLS, as far as I know. I have checked at all the available changelogs I can find, I've ensured I'm using the newest version of all the relevant crates. I'm still fairly bad at Rust and so I don't really understand how I can get around this issue, but I've spent a couple hours unsuccessfully trying to get this working. I've done a fair amount of Googling and haven't found anyone with a similar issue, so I have a bad feeling I'm screwing something up. I've tried every example I can find on the Internet of somebody trying to set up a connection pool, with no luck.
I really appreciate all the work you've done building such awesome Postgres support in Rust, and I'm sorry to bother you with something this simple. Hopefully, you can point me in the right direction. Thanks!