对 SQLite 数据库模式进行版本控制的好方法是什么?

问题描述 投票:0回答:5

对 SQLite 数据库模式进行版本控制的好方法是什么?我正在尝试对 SQLite 数据库进行版本控制,我能找到的唯一选择是使用 GIT 来对整个文件进行版本控制。但我对数据不感兴趣,只是架构的变化。

sql windows sqlite version-control
5个回答
30
投票

我有两个答案。 如果您的 sqlite 足够轻且不经常更新,您可以将其添加到存储库中,而不会产生太多影响/问题。

但是差异的可读性会下降,因为它存储为二进制文件。

sqlite3 git diff

以下是如何让 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
,它应该只执行创建调用并跳过插入。

使用 clean/smudge 进出存储库的 sqlite3 转换

如果您希望将 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
.

转换回数据库。

sqlite3 始终保留最新文件

在 git 中跟踪 sqlite3 二进制文件的正确方法?

.gitattributes

mysqlite3.db merge=keepTheir

希望有帮助。


4
投票

SQLite.org 上的here 记录了一个名为 sqldiff.exe 的命令行实用程序。它提供了各种选项,包括比较模式。要将 git 配置为使用 sqldiff 而不是内置 diff 工具,请查看此讨论:如何使用可视化 diff 程序查看“git diff”输出?。不幸的是,这看起来并不是一项微不足道的任务。

编辑: 看起来获取 sqldiff 工具的唯一方法是下载完整源代码(一直在下载页面底部)并编译它。


4
投票

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 并在提交之前手动调整来缓解这种情况。


3
投票

从sqlite文档中,您可以从sqlite_master隐藏表中提取模式信息。 (https://www.sqlite.org/fileformat2.html#sqlite_master

您可以将此内容保存在 GIT 中的文本文件中,这应该为您提供一种跟踪架构更改的方法。


0
投票

您可以尝试fossil-scm.org,这是一个由SQLite作者为sqlite项目编写的版本控制系统。

© www.soinside.com 2019 - 2024. All rights reserved.