やってみる

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

Rust自習(人称辞典 6)

 生SQLにてGLOB句を使う。

成果物

コード

models.rs

  1. SQLを発行するにはsql_query()メソッドを使う
  2. 1のためにはmodels.rsQueryableByNameが必要
  3. 2のためにテーブルには#[table_name = ""]が必要
  4. 2のために列には#[sql_type = ""]が必要
  5. 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

対象環境

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

前回まで