rustでmysql接続を行う
Rust言語は、このまま開発が順調に行けば、5月15日に1.0 stableがリリースされます。
Rust言語はメモリ管理にガベージコレクションを使わずに、安全なメモリ管理が出来るように設計されたコンパイル言語で、ほぼC言語に近い実装になります。言語仕様の特徴としては、クラスがなく、その代わり構造体とTrait(型クラスを実現します)があり、データ構造自体にメソッドを持たせることが出来るので、副作用がない開発が出来ます。
Cargo.toml
mysqlの接続には、rust-mysql-simple が必要になります。
[package]
name = "mysql-test"
version = "0.1.0"
authors = ["example <name@example.com>"]
[dependencies.mysql]
git = "https://github.com/blackbeam/rust-mysql-simple"
依存関連
ビルドに下記のライブラリが必要です。
sudo apt-get install -y build-essential
sudo apt-get install -y libssl-dev
sudo apt-get install -y cmake
sudo yum install -y libssl-dev cmake gcc openssl-devel
cmakeは必要だったか忘れましたが・・念のため入れておきます。
サンプル
CREATE TABLE `test` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
// mysql接続設定
fn get_opts() -> MyOpts {
let opts = MyOpts {
user: Some("root".to_string()),
pass: Some("root".to_string()),
db_name: Some("test".to_string()),
..Default::default()
};
return opts;
}
// main
fn main() {
let opts = get_opts();
let pool = pool::MyPool::new(opts).unwrap();
let mut stmt = pool.prepare("select * from test;").unwrap();
let result = stmt.execute(&[]).unwrap();
for row in result {
match row {
Ok(v) => {
let name = from_value::<Vec<u8>>(&v[1]);
let name = String::from_utf8(name).unwrap();
println!("id: {}, name: {}", from_value::<i32>(&v[0]), name );
},
Err(e) => println!("error! => {:?}", e)
}
}
}
実行
cargo testを実行することにより、examplesフォルダに入っているコードがビルドされます
cargo test && ./target/debug/examples/mysql
最後に思ったことなど
-
- osxとubuntu両方で試しましたが、ubuntuでしかうまく行きませんでした。osxだとビルドに癖がある様子。
-
- ミュータブル変数なのにあとから変数の内容を書き換えていない場合warnが出るRust言語は素晴らしかった
cargo test は本来 src/lib.rs に書かれているテストと tests/*.rs を実行するものですが、 examples も一緒にコンパイルしてバイナリを履いてくれる機能もあり、嬉しい。
Option型はScalaやSwiftで見かけましたが、Result型もあるんですね。エラーハンドリングがやりやすいです。
.unwrap()でオプショナル型から中身を取り出せるのいいですね。
let nameを何度も定義できる・・・?! これ、Rustではよくサンプルコードで見かけます。
poolをcloneして、スレッドプログラミングすることもできるそうです。すごい。。
コメント欄でこういう方法もあるよ!こういう実装すると便利だよ!みたいなのありましたら、教えてください!
2015-09-29 追記
Rust1.3だと上記のコードがコンパイル通らないようです。
修正版はコメント欄参照です。