生SQLにてGLOB
句を使う。
成果物
コード
models.rs
- 生SQLを発行するにはsql_query()メソッドを使う
- 1のためには
models.rs
にQueryableByNameが必要 - 2のためにテーブルには
#[table_name = ""]
が必要 - 2のために列には
#[sql_type = ""]
が必要 - 3,4のためにdieselの型を調べる
そして書けたのが以下のコード。
use diesel::sql_types::{Integer,Text}; #[derive(QueryableByName, Debug)] #[table_name = "FirstPersons"] pub struct FirstPersonsRaw { #[sql_type = "Integer"] pub id: i32, #[sql_type = "Text"] pub value: String, #[sql_type = "Text"] pub ruby: String, #[sql_type = "Text"] pub comment: String, }
超絶に面倒! 一体いくつ同一テーブルに対する構造体を作らせれば気が済むんだ……。あらゆる一時データ構造を手動で書かねばならない苦痛たるや尋常ならざるものがある。コード内容も冗長なのは見ての通り。これ、仕事増えてるよね? ORMとは一体……。これはお前の仕事だろ……。でもRustは型が明示されるものだから仕方ないね……。
src/bin/glob.rs
src/bin/glob.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,seq::SliceRandom}; fn main() { use personal_pronoun::schema::FirstPersons::dsl::*; let connection = establish_connection(); let sql = "select * from FirstPersons where (',' || comment || ',') glob '*,公的表現,*' or (',' || comment || ',') glob '*,私的表現,*' ;"; let mut results = diesel::sql_query(sql) .load::<self::personal_pronoun::models::FirstPersonsRaw>(&connection); println!("{:?}", results); if let Ok(res_array) = results { for res in res_array { println!("{}: {}", res.id, res.value); } } }
sql_query()メソッドがポイント。戻り値はResult<[FirstPersonsRaw]>
。
生SQL文のほうがスマートに見える……。
参考
副問合せのやり方もあった。いつか使ってみたい。
let versions = Version::belonging_to(krate) .select(id) .order(num.desc()) .limit(5); let downloads = try!(version_downloads .filter(date.gt(now - 90.days())) .filter(version_id.eq(any(versions))) .order(date) .load::<Download>(&conn));
SELECT version_downloads.* WHERE date > (NOW() - '90 days') AND version_id = ANY( SELECT id FROM versions WHERE crate_id = 1 ORDER BY num DESC LIMIT 5 ) ORDER BY date
対象環境
- 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)
- Rust自習(人称辞典 2)
- Rust自習(人称辞典 3)
- Rust自習(人称辞典 4)
- Rust自習(人称辞典 5)
- SQLite3の列からCSVデータを抽出するならLIKEよりGLOBのほうが速いらしい