入门

第 8

数据库:写入前先观察状态

先确认目标和结构,再看数据、做一次受限修改并验证。

数据库也是结构化状态

文件会直接呈现自身内容;数据库则通过数据库引擎呈现状态,包括表或集合、记录、索引和查询。不要从写入开始。先确认所使用的驱动和数据库,再查看已有结构。

这里延续了处理配置文件时的原则:面向真正要操作的逻辑对象——表、行、键或文档——而不是纠结数据在底层如何存放。

`db` 提供共同词汇,但驱动仍然重要

db 镜像常见操作;sqlitemysqlpostgresqlredismongodb 保留各自模型。

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