入門

パート 8

データベース:書く前に状態を見る

対象を確認し、構造を見て、データをプレビューし、一つだけ変更して再確認します。

データベースも構造化された状態

ファイルは内容を直接見せますが、データベースはデータベースエンジンを通して状態を見せます。そこにはテーブルやコレクション、レコード、インデックス、クエリがあります。最初から書き込みをせず、まず使用するドライバーとデータベースを確認し、既存の構造を調べます。

設定ファイルと同じ考え方がここでも役立ちます。物理的な保存方法ではなく、テーブル、行、キー、ドキュメントといった実際に扱いたい論理オブジェクトを基準に考えます。

`db` は共通語彙、ドライバの違いは残る

db は共通操作を共通化し、直接コマンドは各エンジンのモデルを保持します。

install md db sqlite
db
db sqlite
sqlite

SQLite は安全な練習場所

ネットワークやパスワードのない一つのローカルファイルです。練習テーブルを作り -t で確認します。

cd lil-playground
md data
sqlite -c data/notes.sqlite -f
sqlite : CREATE TABLE IF NOT EXISTS notes (id INTEGER PRIMARY KEY, title TEXT NOT NULL, status TEXT NOT NULL)
sqlite -t

最初に構造、次に行

-s はフィールドと型、-n は行のプレビューを示します。空のテーブルも有効な状態です。

sqlite -s notes
sqlite -n notes 10

限定した書き込みは JSON で書ける

-a / -w: 後に JSON を受け取ります。書き込み後は必ず再確認し、削除は明示的な判断にします。

sqlite -a notes : {"title":"First terminal note","status":"draft"}
sqlite -a notes : {"title":"Archive project","status":"done"}
sqlite -n notes 10
sqlite -w notes title "First terminal note" : {"status":"reviewed"}
sqlite -f notes reviewed 20

必要なときは固有の SQL

集計や複雑なクエリは : の固有の SQL で書くのが自然です。

sqlite : SELECT status, COUNT(*) AS count FROM notes GROUP BY status

エクスポートとダンプは目的が違う

エクスポートは可搬データ、ダンプはスキーマ+データの復元用です。緊急時の前に復元を試します。

sqlite -o notes -j data/notes.json -f
sqlite dump data/notes.sql -f
stat data/notes.sql

リモートデータベースは認証情報とネットワークを追加する

エンジンごとに接続モデルが違います。実際のパスワードを再利用スクリプトや公開例へ書かないでください。

db mysql
mysql -c localhost app shop
postgresql -c localhost app shop

スクリプトとして残す

これを database-checkpoint.lil として保存します。練習用の SQLite データベースを開き、テーブルの存在を確認して内容を表示し、ダンプを作成します。実データへの書き込みは自動化しません。繰り返し行うデータベース操作は、確認とバックアップから始めるのが基本です。

#lil
@install md sqlite
cd lil-playground
md data
sqlite -c data/notes.sqlite -f
sqlite : CREATE TABLE IF NOT EXISTS notes (id INTEGER PRIMARY KEY, title TEXT NOT NULL, status TEXT NOT NULL)
sqlite -t
sqlite -n notes 10
sqlite dump data/notes.sql -f