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()); } }
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch 9.0 2018-11-13
- bash 4.4.12(1)-release
- rustc 1.36.0 (a53f9df32 2019-07-03)
- cargo 1.36.0 (c4fcfb725 2019-05-15)
$ uname -a Linux raspberrypi 4.19.42-v7+ #1219 SMP Tue May 14 21:20:58 BST 2019 armv7l GNU/Linux
前回まで
- Rust学習まとめ(ドキュメント)
- Rust自習(じゃんけんゲーム1)
- Rust自習(双方向リスト1)
- Rust自習(単方向リスト1)
- Rust自習(単方向リスト2)
- Rust自習(単方向リスト3)
- Rust自習(単方向リスト4)
- Rust自習(単方向リスト5)
- Rust自習(単方向リスト6)
- Rust自習(単方向リスト7)
- Rust自習(リストのインタフェースを考える)
- Rust自習(連結リスト1)
- Rust自習(連結リスト2)
- Rust自習(連結リスト3)
- Rust自習(連結リスト4)
- Rust自習(連結リストの取得系インタフェース考察)
- Rust自習(連結リスト5)
- Rust自習(連結リストの取得系インタフェース考察2)
- Rust自習(連結リスト6)
- Rust自習(連結リスト7)
- Rust自習(連結リスト8)
- Rust自習(連結リスト9)
- Rust自習(変数名でイテレートする方法)
- Rust自習(iter、iter_mut実装方法)
- Rust自習(連結リスト10)
- Rust自習(rev()実装できず)
- Rust自習(cycle()実装できず)
- Rust自習(じゃんけんゲーム2)
- Rust自習(じゃんけんゲーム3)
- Rust自習(じゃんけんゲーム4)
- Rust自習(じゃんけんゲーム5)
- Rust自習(じゃんけんゲーム6)
- Rust自習(じゃんけんゲーム7)
- Rust自習(じゃんけんゲーム8)
- Rustのアップデート(rustup update)
- Rust自習(SQLite3 1)
- Rust自習(SQLite3 2)