sqlite-diffable 由 simonw

星标

README 源代码

sqlite-diffable

PyPI Changelog License

用于将 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

转换为 JSON 对象

表行存储在 .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"]