追記。タイトルが良くなかったので変えました。r2d2もr2d2_mysqlも関係なくて、rust-mysql-simpleの部分でハマってました。
RustでWebアプリケーションを作っていて、RDBMSとしてMySQLを使おうとしていたところ、問題が。
こんなコード(サンプルをほぼ丸パクリ)で
extern crate mysql;
extern crate r2d2_mysql;
extern crate r2d2;
use std::env;
use std::sync::Arc;
use std::thread;
use mysql::{Opts,OptsBuilder};
use r2d2_mysql::MysqlConnectionManager;
fn main() {
let db_url = env::var("DATABASE_URL").unwrap();
let opts = Opts::from_url(&db_url).unwrap();
let builder = OptsBuilder::from_opts(opts);
let manager = MysqlConnectionManager::new(builder);
let pool = Arc::new(r2d2::Pool::builder()
.max_size(4)
.connection_timeout(std::time::Duration::new(2, 0))
.build(manager)
.unwrap());
}
実行すると
$ DATABASE_URL="mysql://root:password@127.0.0.1:3306/nanntoka" cargo run
Compiling hoge v0.1.0 (file:///home/tmatsushima/Project/hoge)
Finished dev [unoptimized + debuginfo] target(s) in 1.89s
Running `target/debug/hoge`
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Error(Some("DriverError { Could not connect to address `/var/run/mysqld/mysqld.sock\': No such file or directory (os error 2) }"))', libcore/result.rs:983:5
note: Run with `RUST_BACKTRACE=1` for a backtrace.
「 mysqld.sock
が見つからなかったよ、てへぺろ」
じゃぁどうするの
「接続先URLの後ろに ?prefer_socket=false
オプションつけて」っということらしいです。
https://github.com/blackbeam/rust-mysql-simple/issues/150
だから、さっきみたいに cargo run
するときに渡す環境変数を変更して、こんな感じ。
$ DATABASE_URL="mysql://root:password@127.0.0.1:3306/nanntoka?prefer_socket=false" cargo run
なんだそりゃ。接続先指定してるのに。