まとめ
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 build
で SQLite を使用可能にする
サンプル通りベタ書きしてみる
// 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(); }