オンメモリでなくファイルに保存する。
成果物
コード
前回のコードとほぼ同じ。open()
の引数:memory:
をファイルパス/tmp/work/db.sqlite3
にしただけ。
fn main() { let connection = sqlite3::open("/tmp/work/db.sqlite3").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(); connection .iterate("SELECT * FROM users WHERE age > 50", |pairs| { for &(column, value) in pairs.iter() { println!("{} = {}", column, value.unwrap()); } true }) .unwrap(); }
DBファイル確認
$ sqlite3 /tmp/work/db.sqlite3 SQLite version 3.22.0 2018-01-22 18:45:57 Enter ".help" for usage hints.
sqlite> select * from sqlite_master; table|users|users|2|CREATE TABLE users (name TEXT, age INTEGER)
sqlite> .tables users
sqlite> select * from users; Alice|42 Bob|69
sqlite> .exit
ちゃんとDBファイルが作成されていた。成功。
2回目でエラー
2回目以降の実行で「table users already exists
」エラーになる。create
文で作ろうとした名前のテーブルはすでに存在するため怒られた。
$ cargo run ... thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Error { code: Some(1), message: Some("table users already exists") }', src/libcore/result.rs:999:5 note: Run with `RUST_BACKTRACE=1` environment variable to display a backtrace.
テーブル既存確認
select count(*) from sqlite_master where type='table' and name='テーブル名';
取得した1行目1列目が0
なら、テーブル名
テーブルは存在しない。1
なら存在する。
テーブルが既存なら作らない
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(); } } connection .iterate("SELECT * FROM users WHERE age > 50", |pairs| { for &(column, value) in pairs.iter() { println!("{} = {}", column, value.unwrap()); } true }) .unwrap(); }
users
テーブルがないときだけcreate
文を発行する。これで2回目以降もエラーなく実行できる。
対象環境
- 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)