LoginSignup
15
14

More than 5 years have passed since last update.

RustでMySQLを使う

Last updated at Posted at 2015-05-02

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

15
14
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
14