任何人都可以建议一个好方法(或工具)来版本控制 SQLite 数据库(仅限架构)吗? 我正在尝试对 SQLite 数据库进行版本控制,我能找到的唯一选择是使用 GIT 来对整个文件进行版本控制,但此时我对数据不感兴趣,只对架构更改感兴趣。
有什么建议吗?
谢谢:-)
我有两个答案。 如果您的 sqlite 足够轻且不经常更新,您可以将其添加到存储库中,而不会产生太多影响/问题。
但是差异的可读性会下降,因为它存储为二进制文件。
以下是如何让 git 很好地显示差异:
https://gist.github.com/peteristhegreat/a028bc3b588baaea09ff67f405af2909
git config diff.sqlite3.textconv 'sqlite3 $1 .dump'
echo '*.db diff=sqlite3' >> $(git rev-parse --show-toplevel)/.gitattributes
现在,当您的 sqlite 数据库文件发生更改时,您可以使用
git diff
看到更改。
如果您只想查看架构的差异,只需将
.dump
更改为 .schema
,它应该只执行创建调用并跳过插入。
如果您希望将 db 文件作为 sql 而不是 db 推送到存储库中,您可以使用 git 中的 clean/smudge 机制。
https://git-scm.com/book/en/v2/Customizing-Git-Git-Attributes#Keyword-Expansion
https://github.com/gilesbowkett/git-smudge-and-clean
我还没有尝试过,但基本上每当你运行一个数据库文件时,git 都会使用
sqlite3 $1 .schema
导出提交该文件的精简版本(作为 sql 命令)。 然后,当您从数据库中检出该文件时,它会使用 cat $1 | sqlite3
. 转换回数据库。
.gitattributes
mysqlite3.db merge=keepTheir
希望有帮助。
SQLite.org 上的here 记录了一个名为 sqldiff.exe 的命令行实用程序。它提供了各种选项,包括比较模式。要将 git 配置为使用 sqldiff 而不是内置 diff 工具,请查看此讨论:如何使用可视化 diff 程序查看“git diff”输出?。不幸的是,这看起来并不是一项微不足道的任务。
编辑: 看起来获得 sqldiff 工具的唯一方法是下载完整的源代码(一直在下载页面的底部)并编译它。
FWIW,我一直在使用下面摘录的 Makefile 在 Git 中跟踪 13MB/20k 行 SQLite 数据库。两个文件
schema.sql
和 data.sql
存储在 Git 中,并且可以像往常一样将 diff
编辑为文本文件。
SQLITE=sqlite3
SCHEMAFILE=schema.sql
DATAFILE=data.sql
DBFILE=my_database.db
TEMPDB=temp.db
dump: $(DBFILE)
@$(SQLITE) $(DBFILE) .sha3sum >sha3_before
$(SQLITE) $(DBFILE) ".schema --indent" | grep -v sqlite_sequence >$(SCHEMAFILE)
$(SQLITE) $(DBFILE) .dump | grep ^INSERT | grep -v sqlite_sequence >$(DATAFILE)
@rm -f $(TEMPDB)
@cat $(SCHEMAFILE) $(DATAFILE) | $(SQLITE) $(TEMPDB)
@$(SQLITE) $(TEMPDB) .sha3sum >sha3_after
@cmp sha3_before sha3_after
@rm sha3_before sha3_after
@rm $(TEMPDB)
database:
rm -f $(DBFILE)
cat $(SCHEMAFILE) $(DATAFILE) | $(SQLITE) $(DBFILE)
dump
步骤生成新的 schema.sql
和 data.sql
文件,然后从它们生成一个新数据库,并比较前后数据库的 SQLite .sha3sum
,以验证它是否获得了准确的副本。
在我的应用程序中,该数据库用作只读
.db
文件(本质上是产品目录),因此它具有单一更新源。 我的更新周期是:
make database
# update the data in the database as needed
make dump
git commmit schema.sql data.sql
我在此过程中遇到的唯一问题是
.schema
命令有时会在每次生成 CREATE VIEW ...
语句后添加一个格式化的注释字段,并且不会删除旧的注释字段。因此,我的 schema.sql
文件中的评论逐渐增多。我通过查看 git diff 并在提交之前手动调整来缓解这种情况。
从sqlite文档中,您可以从sqlite_master隐藏表中提取模式信息。 (https://www.sqlite.org/fileformat2.html#sqlite_master)
您可以将此内容保存在 GIT 中的文本文件中,这应该为您提供一种跟踪架构更改的方法。
您可以尝试fossil-scm.org,这是一个由SQLite作者为sqlite项目编写的版本控制系统。