日付型を挿入&更新&表示してみる。
成果物
コード
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#のコードファーストが恋しい。
対象環境
- 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)
- 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)