有人能建议一个好的方法(或工具)来控制SQLite数据库(仅限架构)吗?我试图对SQLite数据库进行版本控制,我能找到的唯一选项是使用GIT对版本控制整个文件,但此时我对数据不感兴趣,只是架构发生了变化。 / p>
有什么建议吗?
谢谢: - )
答案 0 :(得分:11)
我有两个答案。如果您的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 db文件发生更改时,您可以看到git diff
的更改。
如果您只想查看架构的差异,只需将.dump
更改为.schema
,它只应执行创建调用并跳过插入。
如果您希望将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
转换回数据库。
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.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
语句后添加格式化的注释字段,并且不会删除旧的注释字段。因此,我的<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并在提交之前手动进行调整来缓解这种情况。