ブログ

読んで思い出す。忘れるために書く

Rust で SQLite を動かしてみる (サンプルコードを関数に切り出す)

まとめ

Cargo Package に公開されている SQLite のサンプルコードをもとに、処理をいくつかの関数として切り出すことができた

ファイルに保存する方法や、SELECT 結果の出力フォーマットをより自由に設定する方法など、まだまだわからないことが多い

手順

プロジェクトの初期化

# sqlite_demo ディレクトリにプロジェクトを新規作成

mkdir sqlite_demo && cd sqlite_demo

# その場のディレクトリにプロジェクトを初期化
cargo new .

SQLite を依存関係に追記・インストールする

cargo.toml の dependencies に SQLite を追記する

[dependencies]
sqlite = "0.24.0"

cargo buildSQLite を使用可能にする

サンプル通りベタ書きしてみる

// src/main.rs

fn main() {
    // インメモリ データベースとして接続先を生成
    let connection = sqlite::open(":memory:").unwrap();

    // テーブルの作成とデータの挿入
    connection
        .execute(
            "
            CREATE TABLE users (name TEXT, age INTEGER);
            INSERT INTO users (name, age) VALUES ('Alice', 42);
            INSERT INTO users (name, age) VALUES ('Bob', 69);
            ",
        )
        .unwrap();

    // 年齢が 15才より上のレコードを選択
    // カラム名と値のセットを標準出力に送出
    connection
        .iterate("SELECT * FROM users WHERE age > 15", |pairs| {
            for &(column, value) in pairs.iter() {
                println!("{} = {}", column, value.unwrap());
            }
            true
        })
    .unwrap();

}

実行する

cargo run

name = Alice
age = 42
name = Bob
age = 69

関数に切り出してみる

サンプルコードでは

  • テーブルの作成
  • データの挿入
  • データの選択

と3つのことをやっているので、それぞれを関数に切り出してみる

fn main() {
    let connection = sqlite::open(":memory:").unwrap();

    create_table(&connection);

    insert_data(&connection);

    find_table_by_age(&connection, 10);
}

fn create_table(connection: &sqlite::Connection) {
    connection
        .execute(
            "
            CREATE TABLE users (name TEXT, age INTEGER);
            ",
        )
        .unwrap();
}

fn insert_data(connection: &sqlite::Connection) {
    connection
        .execute(
            "
            INSERT INTO users (name, age) VALUES ('Alice', 42);
            INSERT INTO users (name, age) VALUES ('Bob', 69);
            ",
        )
        .unwrap();
}

fn find_table_by_age(connection: &sqlite::Connection, age: i8) {
    // {age_value} に変数の値を挿入した クエリ文字列を query に代入
    let query = format!("SELECT * FROM users WHERE age > {age_value}", age_value = age);

    connection
        .iterate(query, |pairs| {
            for &(column, value) in pairs.iter() {
                println!("{} = {}", column, value.unwrap());
            }
            true
        })
    .unwrap();
}

Links