Ruby

ソート、抜粋、削除をしてみましょうか。

めんどくさいので今回はrubyを使わず素のコマンドで書くけど、実際には db.executeの中で使うのよ?

対象のデータ

こんな感じに作ってあるデータテーブルね。

db = SQLite3::Database.new("access1.db")
db_name = "accessed"
newsql = <<SQL
CREATE TABLE #{db_name} (
yymmdd integer,
date text,
title text,
url text,
source text
);
SQL

db名は上の通り、"accessed" になってるわね。URLリクエストを出すと、そこのデータをfirefoxで読み込んでDBに蓄えるってオモチャの一部なのでこんな名前なんだけど、気にしないで。

抜粋&ソート表示。

whareで抜粋、さらに続けて order by カラム名 昇降(asc/desc) でソートね。続けて書けるのが面白いわね。

$ sqlite3 access1.db "select yymmdd,date,title from accessed"
20161109142613|Wed Nov  9 14:26:13 2016|sqlite3 コマンド | コマンドの使い方(Linux)  | hydroculのメモ
20161109144208|Wed Nov  9 14:42:08 2016|トリガーの削除 - SQLite入門
20161109152908|Wed Nov  9 15:29:08 2016|データの削除(DELETE文) - SQLite入門
20161109153005|Wed Nov  9 15:30:05 2016|大釜隧道
20161109153410|Wed Nov  9 15:34:10 2016|大釜隧道

yymmddが 2016/11/19 15:00:00より新しいものだけを、さらにyymmddの降順で。

$ sqlite3 access1.db "select yymmdd,date,title from accessed  where yymmdd > 20161109150000 order by yymmdd desc"
20161109153410|Wed Nov  9 15:34:10 2016|大釜隧道
20161109153005|Wed Nov  9 15:30:05 2016|大釜隧道
20161109152908|Wed Nov  9 15:29:08 2016|データの削除(DELETE文) - SQLite入門

削除

で、削除はどうするかなんだけど。

結論からいうとwhereで条件をそろえてやるのね。

ところで注意がひとつ。

以下のように書くとテーブルの中身が全部消えちゃうから絶対やらないで。

$ sqlite3 access1.db "delete from accessed"

これは絶対ダメ。やっちゃダメよ絶対。絶対だからね! (そしてポチっとな)

推奨は以下ね。

$ sqlite3 access1.db "delete from accessed where yymmdd < 20161109120000"

yymmddってフィールドに入っているのは「 yyyy/mm/dd HH:MM:SS 」って例のアレなので、要は日時ね。これを整数化したフィールドなわけ。

だから上の指定は、2016年11月9日の12:00:00より古いものを消しなさいって事になるわね。


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-11-09 (水) 16:12:30