やってみる

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

Rust自習(diesel 8 SQLite3 ORM serde,chrono)

 日付型を挿入&更新&表示してみる。

成果物

コード

models.rs

 以下のようにpublishedフィールドを追加する。

pub struct NewPost<'a> {
    pub title: &'a str,
    pub body: &'a str,
    pub published: chrono::NaiveDateTime,
}
`published`列を追加。

lib.rs

pub fn create_post(conn: &SqliteConnection, title: &str, body: &str) -> usize {
    use schema::posts;

    let new_post = crate::models::NewPost { title, body, published: chrono::Local::now().naive_local() };

    diesel::insert_into(posts::table)
        .values(&new_post)
        .execute(conn)
        .expect("Error saving new post")
}

実行

$ cargo run --bin write_post
   Compiling diesel_hello v0.1.0 (/tmp/work/Rust.Diesel.Chrono.20190727181847/src/0/diesel_hello)
    Finished dev [unoptimized + debuginfo] target(s) in 21.39s
     Running `target/debug/write_post`
タイトル> 
日付挿入される記事

本文(終了:CTRL+D)

今、いつ?
ここ、どこ?
保存した。ドラフト「日付挿入される記事」 id: 1

確認

$ sqlite3 /tmp/work/Rust.Diesel.Chrono.20190727181847/src/0/diesel_hello/db.sqlite3
...
sqlite> select * from posts;
1|記事のタイトル|記事の本文。
複数行を書く。
Ctrl+dキーで終了。
最終行。
|1|
2|ドラフトだから表示されない|見せられないよ!
|f|
3|日付挿入される記事|今、いつ?
ここ、どこ?|f|2019-07-29 10:15:57.100142045
sqlite> 

 成功! 2019-07-29 10:15:57.100142045が挿入されている。

 まあ、本当は公開時にセットすべきなのだが。created, publishedの2つの日付があってもいいかも? ついでにupdatedも?

src/bin/publish_post.rs

 公開したとき、その日付をpublished列にセットする。

//    use diesel_hello::schema::posts::dsl::{posts, is_published};
    use diesel_hello::schema::posts::dsl::{posts, is_published, published};
// ...
    let _ = diesel::update(posts.find(id))
//        .set(is_published.eq(true))
        .set((is_published.eq(true), published.eq(chrono::Local::now().naive_local())))
        .execute(&connection)
        .unwrap_or_else(|_| panic!("Unable to find post {}", id));

 コメントアウトしたところを修正した。

 実行。

$ cargo run --bin publish_post 3
...
Published post 日付挿入される記事

 確認。

$ sqlite3 /tmp/work/Rust.Diesel.Chrono.20190727181847/src/0/diesel_hello/db.sqlite3
...
sqlite> select * from posts;
1|記事のタイトル|記事の本文。
複数行を書く。
Ctrl+dキーで終了。
最終行。
|1|
2|ドラフトだから表示されない|見せられないよ!
|f|
3|日付挿入される記事|今、いつ?
ここ、どこ?|1|2019-07-29 10:33:29.849228227

 対象記事のpublished値が更新されている。OK。

src/bin/show_posts.rs

 表示されるようにしてみる。

//...
    for post in results {
        if let Some(p) = post.published { println!("{}", p); } // 追加
        println!("{}", post.title);
        println!("----------\n");
        println!("{}", post.body);
    }
//...
$ cargo run --bin show_posts
    Finished dev [unoptimized + debuginfo] target(s) in 0.22s
     Running `target/debug/show_posts`
Displaying 2 posts
記事のタイトル
----------

記事の本文。
複数行を書く。
Ctrl+dキーで終了。
最終行。

2019-07-29 10:33:29.849228227
日付挿入される記事
----------

今、いつ?
ここ、どこ?

 日付が表示された。成功!

所感

 とりあえずこれでRustでDBを扱う方法は一区切りついたことにする。

 それにしても、dieselのDBは三重管理。(SQL create, schema.rs, models.rs) あまりにも面倒すぎる。楽に管理するために使うはずなのに、逆に手間が増えているのではないかという気がしてしまう。C#のコードファーストが恋しい。

対象環境

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

前回まで