ランダムで1件取得する。
成果物
Cargo.toml
[dependencies] diesel = { version = "1.4.2", features = ["sqlite", "chrono"] } dotenv = "0.14.1" chrono = { version = "0.4", features = ["serde"] } serde = { version = "1.0.97", features = ["derive"] } serde_json = "1.0.40" json5 = "0.2.5" rand = "0"
初回ビルドでダウンロード&コンパイル。json5
とchrono
は今のところ使ってないしその予定もないが一応。
cargo build
schema.rs
前回までで以下のように自動生成されている。
table! { FirstPersons (id) { id -> Nullable<Integer>, value -> Text, ruby -> Nullable<Text>, comment -> Nullable<Text>, } }
id
のNullable
を外して以下のように修正する。
table! { FirstPersons (id) { id -> Integer, value -> Text, ruby -> Nullable<Text>, comment -> Nullable<Text>, } }
これを元にmodels.rs
ファイルを作成する。
models.rs
#[derive(Queryable)] pub struct FirstPersons { pub id: i32, pub value: String, pub ruby: Option<String>, pub comment: Option<String>, }
lib.rs
#[macro_use] extern crate diesel; extern crate dotenv; pub mod models; pub mod schema; use diesel::prelude::*; use dotenv::dotenv; use std::env; pub fn establish_connection() -> SqliteConnection { dotenv().ok(); let database_url = env::var("DATABASE_URL").expect("DATABASE_URL must be set"); SqliteConnection::establish(&database_url) .unwrap_or_else(|_| panic!("Error connecting to {}", database_url)) }
main.rs
extern crate diesel; extern crate personal_pronoun; use self::diesel::prelude::*; use self::personal_pronoun::models::*; use self::personal_pronoun::*; use rand::{distributions::{Distribution, Standard},Rng}; fn main() { use personal_pronoun::schema::FirstPersons::dsl::*; let connection = establish_connection(); let count: i64 = personal_pronoun::schema::FirstPersons::dsl::FirstPersons.count().get_result(&connection).unwrap(); println!("count: {}", count); let mut rng = rand::thread_rng(); let rnd_id = rng.gen_range(0, count-1); println!("rnd_id: {}", rnd_id); let results = personal_pronoun::schema::FirstPersons::dsl::FirstPersons .filter(id.eq(rnd_id as i32)) .load::<self::personal_pronoun::models::FirstPersons>(&connection) .expect("Error loading table."); for first in results { println!("{}", first.value); } }
FirstPersons
という名前がschema.rs
とmodels.rs
で重複していたのでフルネーム指定した。
cargo run
count: 123 rnd_id: 35 あてくし
LIKE
句でカンマを含む値にマッチさせたい。SQL文なら以下のような。
sqlite> select * from FirstPersons where (',' || comment || ',') LIKE '%,私的表現,%';
*私的表現*
*,私的表現*
*私的表現,*
*,私的表現,*
let results = personal_pronoun::schema::FirstPersons::dsl::FirstPersons .filter(id.eq(rnd_id as i32) .and(comment.eq("私的表現").or(like("私的表現,%")).or(like("%,私的表現")).or(like("%,私的表現,%"))) )
対象環境
- 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自習(じゃんけんゲーム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)
- Rust自習(SQLite3 3)
- Rust自習(日時 1 chrono)
- Rust自習(日時 2 chrono)
- Rust自習(日時 3 chrono)
- Rust自習(日時 4 chrono)
- Rust自習(日時 5 chrono)
- Rust自習(日時 6 chrono)
- Rust自習(日時 7 chrono)
- Rust自習(std::time::SystemTime)
- Rust自習(std::time::Instant)
- Rust自習(std::time::Duration)
- Rust自習(シリアライズ serde 1)
- JSON5とは?
- Rust自習(シリアライズ serde 2 JSON5)
- Rust自習(シリアライズ serde 3 chrono日時型変換)
- Rust自習(diesel 1 SQLite3 ORM)
- Rust自習(diesel 2 SQLite3 ORM)
- Rust自習(diesel 3 SQLite3 ORM)
- Rust自習(diesel 4 SQLite3 ORM)
- Rust自習(diesel 5 SQLite3 ORM)
- Rust自習(diesel 6 SQLite3 ORM)
- Rust自習(diesel 7 SQLite3 ORM serde,chrono)
- Rust自習(diesel 8 SQLite3 ORM serde,chrono)
- Rustで正規表現(regex 1)
- Rustで正規表現(regex 2)
- Rustで正規表現(regex 3)
- Rustで正規表現(regex 4)
- Rustで正規表現(regex 5)
- Rust自習(人称辞典 1)