PR

Rust を使って MySQL へ接続

1. はじめに

Rust で MySQL へ接続する方法を試してみたので覚書として残しておきます。
環境構築の手順は こちらの記事こちらの記事 を参考にしてください。

2. mysqlclient のインストール

Windows 環境で Rust を使って MySQL に接続するにあたり、Diesel CLI を使うことで簡単に接続できるみたいですが、そのためには事前に mysqlclient をインストールする必要があります。

こちらから https://dev.mysql.com/downloads/installer/ ダウンロードしてインストールします。
Server only を選択し、MySQL Server をインストールします。

インストール後、ユーザーの環境変数に以下を追加します。

MYSQLCLIENT_LIB_DIR=C:\Program Files\MySQL\MySQL Server 8.0\lib
MYSQLCLIENT_VERSION=8.0.xx

MYSQLCLIENT_VERSION はインストールしたバージョンに合わせて変更してください。
以下でバージョンを確認できます。

"C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe" --version

3. Diesel CLI のインストール

続いて以下のコマンドで Diesel CLI をインストールします。

cargo install diesel_cli --no-default-features --features mysql

4. プロジェクト作成

必要なインストールは完了したので、プロジェクトを作成します。

cargo new mysql_sample
cd mysql_sample

5. .env ファイルの作成

プロジェクトのルートに .env ファイルを作成し、以下を記述します。

DATABASE_URL=mysql://root:password@localhost:3306/sample_db

6. Diesel CLI の初期化

Diesel CLI を初期化します。

diesel setup

7. Cargoの設定フォーマットにDieselを追記

Cargo.toml に以下を追加します。

[dependencies]
diesel = { version = "2.2.0", features = ["mysql"] }
dotenv = "0.15.0"

8. Rust で MySQL に接続

Database は作成済みで Task テーブルにはデータが入っているものとします。
以下のコードを main.rs に記述します。

use dotenv::dotenv;
use diesel::prelude::*;
use diesel::mysql::MysqlConnection;

#[macro_use]
extern crate diesel; // Dieselのマクロを使用するために必要です。

pub mod schema {
    // Dieselのtable!マクロを使用して、データベースのスキーマを定義します。
    table! {
        task (id) {
            id -> Integer,
            title -> Varchar,
        }
    }
}

// Debug トレイトを自動導出し、構造体の内容をデバッグ出力できるようにします。
// Queryable トレイトを自動導出し、データベースからのクエリ結果をこの構造体にマッピングできるようにします。
#[derive(Debug, Queryable)]
pub struct Task {
    pub id: i32,
    pub title: String,
}

// スキーマのtaskテーブルをtask_schemaとして使用します。
use schema::task as task_schema;

fn main() {
    // .envファイルから環境変数を読み込みます。
    dotenv().ok();

    // DATABASE_URL環境変数を取得します。設定されていない場合はエラーを発生させます。
    let db_url = std::env::var("DATABASE_URL").expect("DATABASE_URL must be set");
    println!("DATABASE_URL: {}", db_url);

    // データベースに接続します。接続に失敗した場合はエラーメッセージを表示します。
    let mut connection = MysqlConnection::establish(&db_url)
        .expect(&format!("Error connecting to {}", db_url));
    println!("Connected to database");

    // taskテーブルからデータを取得します。取得に失敗した場合はエラーメッセージを表示します。
    let results = task_schema::dsl::task
        .load::<Task>(&mut connection)
        .expect("Error loading brands");

    // 取得したデータを1件ずつ表示します。
    for task in results {
        println!("{:?}", task);
    }
}

9. ビルド と 実行

追加したらビルドします。

cargo build

ビルドが成功したら実行します。

cargo run

以下のような出力がされれば成功です。

DATABASE_URL: mysql://root:password@localhost:3306/sample_db
Connected to database
Task { id: 1, title: "task1" }
Task { id: 2, title: "task2" }
Task { id: 3, title: "task3" }

10. まとめ

Rust で MySQL に接続する方法を試してみましたが、Diesel CLI を使うことで簡単に接続できることがわかりました。
既存のデータベースに接続してデータを取得することが確認できました。
挿入や更新、削除も可能なので、次回はそれらの操作も試してみたいと思います。
今回の記事も、Github Copilot が8割くらい書いてくれました。

A. 参考サイト

diesel_cliのインストールに割と苦労した話
Windows環境下でのdiesel_cliのインストールMySQLの場合
RustでMySQL接続まで頑張った話
Rustの環境構築とMysql接続
Rust + MySQL + Diesel(1)

B. 参考書籍

コメント