用于将 SQLite 数据库转储/加载到可比较目录结构的工具
pip install sqlite-diffable
位于 simonw/simonwillisonblog-backup 的仓库包含我博客 https://simonwillison.net/ 数据库的备份 - 使用本工具创建。
给定一个名为 fixtures.db
的 SQLite 数据库,其中包含表 facetable
,以下命令将该表转储到 dump/
目录
sqlite-diffable dump fixtures.db dump/ facetable
要转储该数据库中的所有表,使用 --all
选项
sqlite-diffable dump fixtures.db dump/ --all
要转储除特定表之外的所有表,使用一次或多次 --exclude
选项
sqlite-diffable dump fixtures.db dump/ --all \
--exclude unwanted_first_table \
--exclude unwanted_second_table
要加载之前转储的数据库,运行以下命令
sqlite-diffable load restored.db dump/
如果任何正在恢复的表已存在于数据库文件中,则会显示错误。
你可以使用 --replace
选项替换这些表(在恢复前删除它们)。
sqlite-diffable load restored.db dump/ --replace
表行存储在 .ndjson
文件中,作为换行符分隔的 JSON 数组,如下所示
["a", "a", "a-a", 63, null, 0.7364712141640124, "$null"]
["a", "b", "a-b", 51, null, 0.6020187290499803, "$null"]
有时使用 JSON 对象列表会更方便。
sqlite-diffable objects
命令可以读取 .ndjson
文件及其配套的 .metadata.json
文件,并将 JSON 对象输出到标准输出
sqlite-diffable objects fixtures.db dump/sortable.ndjson
该命令的输出如下所示
{"pk1": "a", "pk2": "a", "content": "a-a", "sortable": 63, "sortable_with_nulls": null, "sortable_with_nulls_2": 0.7364712141640124, "text": "$null"}
{"pk1": "a", "pk2": "b", "content": "a-b", "sortable": 51, "sortable_with_nulls": null, "sortable_with_nulls_2": 0.6020187290499803, "text": "$null"}
添加 -o
参数将输出写入文件
sqlite-diffable objects fixtures.db dump/sortable.ndjson -o output.txt
添加 --array
参数以输出 JSON 对象数组,而不是换行符分隔的文件
sqlite-diffable objects fixtures.db dump/sortable.ndjson --array
输出
[
{"pk1": "a", "pk2": "a", "content": "a-a", "sortable": 63, "sortable_with_nulls": null, "sortable_with_nulls_2": 0.7364712141640124, "text": "$null"},
{"pk1": "a", "pk2": "b", "content": "a-b", "sortable": 51, "sortable_with_nulls": null, "sortable_with_nulls_2": 0.6020187290499803, "text": "$null"}
]
每个表由两个文件表示。第一个文件 table_name.metadata.json
包含描述表结构的元数据。对于名为 redirects_redirect
的表,该文件可能如下所示:
{
"name": "redirects_redirect",
"columns": [
"id",
"domain",
"path",
"target",
"created"
],
"schema": "CREATE TABLE [redirects_redirect] (\n [id] INTEGER PRIMARY KEY,\n [domain] TEXT,\n [path] TEXT,\n [target] TEXT,\n [created] TEXT\n)"
}
它是一个包含三个键的对象:name
是表的名称,columns
是列字符串数组,而 schema
是用于该表的 SQL 模式文本。
第二个文件 table_name.ndjson
包含表中每一行的换行符分隔 JSON(也称为 JSON Lines)。每一行表示为一个 JSON 数组,其中的项目对应于元数据中定义的每个列。
该表 redirects_redirect.ndjson
的文件可能如下所示:
[1, "feeds.simonwillison.net", "swn-everything", "https://simonwillison.net/atom/everything/", "2017-10-01T21:11:36.440537+00:00"]
[2, "feeds.simonwillison.net", "swn-entries", "https://simonwillison.net/atom/entries/", "2017-10-01T21:12:32.478849+00:00"]
[3, "feeds.simonwillison.net", "swn-links", "https://simonwillison.net/atom/links/", "2017-10-01T21:12:54.820729+00:00"]