やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

Rust自習(SQLite3 3)

 prepareメソッドで条件を後付する。

成果物

参考

コード

prepareメソッド

fn main() {
    let connection = sqlite3::open("/tmp/work/db.sqlite3").unwrap();

    // 以下のようにパニックしたらテーブル作成コードをコメントアウトする。
    // thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Error { code: Some(1), message: Some("table users already exists") }'
    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();

    let mut statement = connection
        .prepare("SELECT * FROM users WHERE age > ?")
        .unwrap();
    statement.bind(1, 50).unwrap();

    while let sqlite3::State::Row = statement.next().unwrap() {
        println!("name = {}", statement.read::<String>(0).unwrap());
        println!("age = {}", statement.read::<i64>(1).unwrap());
    }
}
$ cargo run
...
name = Bob
age = 69

 ?50で置き換えた。

cursor

    let mut cursor = connection
        .prepare("SELECT * FROM users WHERE age > ?")
        .unwrap()
        .cursor();
    cursor.bind(&[sqlite3::Value::Integer(50)]).unwrap();

    while let Some(row) = cursor.next().unwrap() {
        println!("name = {}", row[0].as_string().unwrap());
        println!("age = {}", row[1].as_integer().unwrap());
    }

 カーソルを使う。

テーブルが既存なら作らない

fn main() {
    let connection = sqlite3::open("/tmp/work/db.sqlite3").unwrap();

    if let Some(row) = connection.prepare("select count(*) from sqlite_master where type='table' and name='users';").unwrap().cursor().next().unwrap() {
        if 0 == row[0].as_integer().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();
        }
    }

    let mut statement = connection
        .prepare("SELECT * FROM users WHERE age > ?")
        .unwrap();
    statement.bind(1, 50).unwrap();

    while let sqlite3::State::Row = statement.next().unwrap() {
        println!("name = {}", statement.read::<String>(0).unwrap());
        println!("age = {}", statement.read::<i64>(1).unwrap());
    }
}
fn main() {
    let connection = sqlite3::open("/tmp/work/db.sqlite3").unwrap();

    if let Some(row) = connection.prepare("select count(*) from sqlite_master where type='table' and name='users';").unwrap().cursor().next().unwrap() {
        if 0 == row[0].as_integer().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();
        }
    }

    let mut cursor = connection
        .prepare("SELECT * FROM users WHERE age > ?")
        .unwrap()
        .cursor();
    cursor.bind(&[sqlite3::Value::Integer(50)]).unwrap();

    while let Some(row) = cursor.next().unwrap() {
        println!("name = {}", row[0].as_string().unwrap());
        println!("age = {}", row[1].as_integer().unwrap());
    }
}

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1219 SMP Tue May 14 21:20:58 BST 2019 armv7l GNU/Linux

前回まで