#sqlite #directory #text #convert #git-repository #json-file

bin+lib sqlite2dir

将 sqlite3 数据库导出到文件系统

2 个不稳定版本

0.2.0 2019 年 9 月 14 日
0.1.0 2019 年 9 月 8 日

#1257 in 数据库接口

GPL-3.0-or-later

29KB
544

sqlite2dir

sqlite2dir 将 SQLite 3 数据库的内容以纯文本文件集合的形式暴露出来。其预期用途不是数据库备份 -- 提供的视图旨在使人类更容易检查和跟踪 SQLite 数据库的更改。输出格式选择是为了让像 diffgit 这样的操作纯文本文件的工具能够很好地工作。

为了支持更改跟踪,sqlite2dir 支持将数据库导出的文件树直接提交到裸 Git 仓库,这允许使用常规 Git 工具检查更改历史。

请注意,sqlite2dir 目前处于初始开发阶段,甚至尚未由其作者部署。适用通常的警告。

文档

sqlite2dir 的文档以 man 页面 的形式提供。Markdown 文件可以使用 pandoc 转换为 troff 格式,以便使用 man 命令查看。请注意,markdown 源针对通过 pandoc 处理而优化,因此不会在 github 或类似的平台上很好地渲染,也不适合直接阅读。

使用 Unix 的 man 命令生成和查看 man 页面

pandoc -s -t man sqlite2dir.1.md -o sqlite2dir.1
man -l sqlite2dir.1

您还可以在 网上 找到 man 页面的 pandoc HTML 渲染版本。

安装

由于 sqlite2dir 使用 Rust 编写,您需要一个 Rust 工具链。需要 Rust 1.37 或更高版本。要从 crates.io 获取最新版本,请使用以下命令:

cargo install sqlite2dir

或者,您可以直接从源代码检出运行它

cargo run -- --help
cargo run -- db.sqlite3 db-contents

要从本地检出源安装,请使用 cargo install --path .,这将在 ~/.cargo/bin/sqlite2dir 中安装可执行文件,如果您遵循了 Rust 工具链安装说明,则它应该已经在您的 PATH 环境变量中。

静态构建

对于部署到Linux目标,一个有吸引力的选项是使用Rust的MUSL目标创建一个静态链接的二进制文件。这将产生一个完全独立的二进制文件,仅依赖于Linux内核的系统调用ABI。

在这种情况下,您需要启用vendored-sqlite功能标志,以便链接到嵌入的、新编译的libsqlite3的副本。

# If you haven't installed the MUSL target already, let's do that now:
rustup target add x86_64-unknown-linux-musl
# Build using a compiled-in copy of libsqlite3
cargo build --target x86_64-unknown-linux-musl --features vendored-sqlite --release
# Let's check it's really a static binary
file target/x86_64-unknown-linux-musl/release/sqlite2dir \
  | grep -q 'statically linked' || echo "nope"

用法

将sqlite3数据库的转储到目录中

sqlite2dir db.sqlite3 db-contents

在新建的db-contents目录中,您将找到包含数据库模式的SQL文件集合,以及每个表的表内容对应的JSON文件。

SQL表格数据文件的格式是一系列JSON数组,每一行是一个包含单个数据库行列数据的独立JSON数组。这种格式被选择以满足以下标准:

  • 合理的diff输出,同时保留值的类型。特别是,NULL值以JSON null表示,可以与“NULL”字符串或空字符串区分开来。
  • 允许使用操作整个值的JSON解析器和序列化器进行流式创建和消费。

请注意,SQLite的“blob”数据类型尚不支持,如果遇到blob,数据库转储将中止。有关详细信息,请参阅下方的“计划中的功能”。

计划中的功能

以下功能是计划中的,大致按照作者认为的重要性顺序。在开发过程中,项目将在完成时从下方移动到变更日志中。

  • 生成一个简短的报告的选项,适合用作电子邮件消息正文。
  • 包括一些基本烟雾测试的测试框架。
  • 支持SQLite的“blob”数据类型。基本实现是将blob内容进行哈希处理,并将其作为自己的文件输出到磁盘。然后,数据库列将包含如下引用:{"blob-sha3-256": "SHA-3-here"}。改进的做法是对小型blob进行base64编码,并将其存储在内联中。

可能未来的功能

  • 添加支持--run参数,允许指定配置文件,以便在单次运行中执行多个数据库提取。
  • 使用--run,添加多线程操作的可能性。
  • 额外的数据库后端。我不预计需要这个功能,所以可能不会自己添加它。欢迎Pull请求!

非功能特性

sqlite2dir不是,也无意成为,并且很可能永远不会成为数据库备份工具。SQLite在其命令行工具中提供了.dump.backup元命令,应使用这些命令代替。这样,甚至可以恢复数据!

示例用例

这是促使开发sqlite2dir的场景。

PowerDNS(又名pdns)授权域名服务器提供了多种数据库后端,除了在纯文本区域文件上运行的“bind”后端之外。使用数据库后端更加灵活,但无法轻松跟踪区域内容的更改。当使用纯文本区域文件时,只需将区域文件放入git仓库即可轻松实现更改跟踪。使用sqlite2dir,您可以在使用SQLite pdns后端时恢复该功能。

以下命令将提取数据库并将其提交到裸git仓库

sqlite2dir --git-name="Clara Root" --git-email="root@localhost" \
    /var/lib/pdns/pdns.sqlite3 /var/lib/pdns/pdns.git

通过添加一个定期执行上述命令的任务,例如通过cronsystemd定时器,可以在裸git仓库中积累历史记录,这可以用于故障排除或其他分析。

许可证

sqlite2dir存储库中的代码和文档是免费软件,根据GNU GPL许可证,版本3.0或更高版本授权。

依赖项

~34MB
~710K SLoC