やってみる

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

Rust自習(diesel 4 SQLite3 ORM)

 データを削除する。

成果物

コード

 以下ファイルを新規作成する。

src/bin/delete_post.rs

extern crate diesel;
extern crate diesel_hello;

use self::diesel::prelude::*;
use self::diesel_hello::*;
use std::env::args;

fn main() {
    use diesel_hello::schema::posts::dsl::*;

    let target = args().nth(1).expect("Expected a target to match against");
    let pattern = format!("%{}%", target);

    let connection = establish_connection();
    let num_deleted = diesel::delete(posts.filter(title.like(pattern)))
        .execute(&connection)
        .expect("Error deleting posts");

    println!("Deleted {} posts", num_deleted);
}

 引数を1つもらう。それはタイトルに部分一致させる文字列。つまり、指定した文字列がタイトルに含まれた記事データを削除する。

実行

削除する記事データをつくる

$ cargo run --bin write_post
   Compiling diesel_hello v0.1.0 (/tmp/work/Rust.Diesel.20190727130150/src/3/diesel_hello)
    Finished dev [unoptimized + debuginfo] target(s) in 11.82s
     Running `target/debug/write_post`
タイトル> 
削除予定の記事ですわ

本文(終了:CTRL+D)

これ、消しますわ。

保存した。ドラフト「削除予定の記事ですわ」 id: 1
$ sqlite3 ./db.sqlite3
SQLite version 3.22.0 2018-01-22 18:45:57
Enter ".help" for usage hints.
sqlite> select * from posts;
1|記事のタイトル|記事の本文。
複数行を書く。
Ctrl+dキーで終了。
最終行。
|1
2|削除予定の記事ですわ|これ、消しますわ。
|f

 記事は追加できた。

バグ発見

 write_postで記事を作成したときid: 1と表示されたが、DBファイルをみると実際は2である。

保存した。ドラフト「削除予定の記事ですわ」 id: 1
2|削除予定の記事ですわ|これ、消しますわ。|f

 おそらく表示しているのは対象レコード件数1であって、idではない。

 まあいいか。

削除してみる

$ cargo run --bin delete_post ですわ
...
Deleted 1 posts
sqlite> select * from posts;
1|記事のタイトル|記事の本文。
複数行を書く。
Ctrl+dキーで終了。
最終行。
|1

 タイトルにですわを含む記事が削除された。成功!

対象環境

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

前回まで