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だと上記のコードがコンパイル通らないようです。
修正版はコメント欄参照です。

bannerAds