什么';是版本控制SQLite数据库(仅限模式)的好方法(或工具)吗?

什么';是版本控制SQLite数据库(仅限模式)的好方法(或工具)吗?,sql,database,sqlite,version-control,windows-7,Sql,Database,Sqlite,Version Control,Windows 7,有人能推荐一种版本控制SQLite数据库(仅限模式)的好方法(或工具)吗?我正在尝试对SQLite数据库进行版本控制,我能找到的唯一选项是使用GIT对整个文件进行版本控制,但我现在对数据不感兴趣,只对模式更改感兴趣 有什么建议吗 谢谢:-)从sqlite文档中,您可以从sqlite_主隐藏表中提取模式信息。() 您可以将此内容保存在GIT中的文本文件中,这将为您提供一种跟踪架构更改的方法。在SQLite.org上有一个名为sqldiff.exe的命令行实用程序。它提供了各种选项,包括比较模式。要

有人能推荐一种版本控制SQLite数据库(仅限模式)的好方法(或工具)吗?我正在尝试对SQLite数据库进行版本控制,我能找到的唯一选项是使用GIT对整个文件进行版本控制,但我现在对数据不感兴趣,只对模式更改感兴趣

有什么建议吗


谢谢:-)

从sqlite文档中,您可以从sqlite_主隐藏表中提取模式信息。()


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

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

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

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

但diff的可读性下降了,因为它存储为二进制文件

sqlite3 git差异 下面是如何让git很好地显示差异:

现在,当您的sqlite db文件更改时,您可以通过
git diff
看到更改

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

使用clean/smudge在存储库内外进行sqlite3转换 如果希望将数据库文件作为sql而不是数据库推送到存储库中,可以使用git中的clean/smudge机制

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

sqlite3始终保留最新的文件


希望能有所帮助。

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数据库
#根据需要更新数据库中的数据
倾倒
git commmit schema.sql data.sql

我在这个过程中遇到的唯一问题是,
.schema
命令有时会在每次生成
CREATE VIEW…
语句之后添加一个格式化的注释字段,并且不会删除旧的注释字段。因此,在我的
schema.sql
文件中,注释逐渐增多。我通过查看git diff并在提交之前手动调整来缓解这种情况。

您是在尝试跟踪开发更改,还是在尝试将其合并到应用程序中?我正在尝试跟踪开发更改。正在尝试查找与Redgate的SQL源代码管理工具非常相似的工具。感谢您的建议,不幸的是,sqldiff“目前没有显示触发器、视图的差异…”。我还需要几个版本控制。在我的设置中,git diff给出了一个错误
错误:near“/”:语法错误致命:无法将文件读取到diff
。修复方法是将
sqlite3$1.dump
移动到一个单独的shell脚本中,并从textconv设置中引用它。听起来好像您有权限问题或文件不存在。您是否尝试过键入
sqlite path/to/filename.db.dump
与@Eero的问题相同。这反而起到了作用:
git config diff.sqlite3.textconv'f(){sqlite3“$@.dump;};f'
.gitattributes

mysqlite3.db merge=keepTheir

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)