rustでmysql接続を行う
Rust言語は、このまま開発が順調に行けば、5月15日に1.0 stableがリリースされます。
Rust言語はメモリ管理にガベージコレクションを使わずに、安全なメモリ管理が出来るように設計されたコンパイル言語で、ほぼC言語に近い実装になります。言語仕様の特徴としては、クラスがなく、その代わり構造体とTrait(型クラスを実現します)があり、データ構造自体にメソッドを持たせることが出来るので、副作用がない開発が出来ます。
Cargo.toml
mysqlの接続には、rust-mysql-simple
が必要になります。
Cargo.toml
[package]
name = "mysql-test"
version = "0.1.0"
authors = ["example <name@example.com>"]
[dependencies.mysql]
git = "https://github.com/blackbeam/rust-mysql-simple"
依存関連
ビルドに下記のライブラリが必要です。
ubuntu
sudo apt-get install -y build-essential
sudo apt-get install -y libssl-dev
sudo apt-get install -y cmake
centos
sudo yum install -y libssl-dev cmake gcc openssl-devel
cmakeは必要だったか忘れましたが・・念のため入れておきます。
サンプル
mysql_schema
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;
examples/mysql.rs
// 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だと上記のコードがコンパイル通らないようです。
修正版はコメント欄参照です。