什么是版本控制SQLite数据库(仅限架构)的好方法(或工具)?

时间:2015-11-19 16:54:57

标签: sql database sqlite version-control windows-7

有人能建议一个好的方法(或工具)来控制SQLite数据库(仅限架构)吗?我试图对SQLite数据库进行版本控制,我能找到的唯一选项是使用GIT对版本控制整个文件,但此时我对数据不感兴趣,只是架构发生了变化。 / p>

有什么建议吗?

谢谢: - )

4 个答案:

答案 0 :(得分:11)

我有两个答案。如果您的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 db文件发生更改时,您可以看到git diff的更改。

如果您只想查看架构的差异,只需将.dump更改为.schema,它只应执行创建调用并跳过插入。

使用clean / smudge 进出存储库的

sqlite3转换

如果您希望将db文件作为sql而不是数据库推送到存储库中,则可以使用git中的clean / smudge机制。

https://git-scm.com/book/en/v2/Customizing-Git-Git-Attributes#Keyword-Expansion

https://github.com/gilesbowkett/git-smudge-and-clean

我还没有尝试过,但基本上每当你遇到一个db文件时,git都会使用sqlite3 $1 .schema导出提交文件的精简版本(作为sql命令)。然后,当您从数据库中签出该文件时,它将使用cat $1 | sqlite3转换回数据库。

sqlite3始终保留最新文件

Right way of tracking a sqlite3 binary file in git?

.gitattributes

mysqlite3.db merge=keepTheir

希望有所帮助。

答案 1 :(得分:4)

SQLite.org上有一个名为sqldiff.exe的命令行实用程序here。它提供了各种选项,包括比较模式。要配置git以使用sqldiff而不是内置的diff工具,请查看以下讨论:How do I view 'git diff' output with a visual diff program?。不幸的是,它看起来不是一项微不足道的任务。

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

FWIW,我已经使用下面摘录的Makefile跟踪了Git中一个13MB / 2万行的SQLite数据库。 schema.sqldata.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.sqldata.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语句后添加格式化的注释字段,并且不会删除旧的注释字段。因此,我的<div class="floating-label-wrap"> <input aria-label="source date time from" [(ngModel)]="sourceDatetimeFromDate" [owlDateTime]="sourceDatetimeFromDt" hidden /> <input [value]="sourceDatetimeFromDate | date: 'yyyy-MM-dd HH:mm:ss'" /> <label class="label-datetime"> <span class="content-name">Date Range From</span> </label> <span class="date-trigger-icon" [owlDateTimeTrigger]="sourceDatetimeFromDt"> <mat-icon>date_range</mat-icon> </span> <owl-date-time #sourceDatetimeFromDt></owl-date-time> </div> 文件中的评论逐渐增多。我通过查看git diff并在提交之前手动进行调整来缓解这种情况。