您使用什么方法对数据库进行版本控制?我已将所有数据库表作为单独的 .sql 脚本提交到我们的存储库 (mercurial)。这样,如果团队的任何成员对员工表进行更改,例如,当我更新存储库时,我将立即知道哪个特定表已被修改。
这种方法在:代码控制下数据库脚本的最佳实践是什么中进行了描述。目前,我正在编写一个 python 脚本来执行数据库文件夹中的所有 .sql 文件,但是,由于外键约束而导致的依赖关系问题确保我们不能仅以任何顺序运行 .sql 文件。
python 脚本用于生成一个文件,其中包含执行 .sql 文件的顺序。它将按照 .sql 文件在 tableorder.txt 文件中出现的顺序执行这些文件。一个表只有在其外键表被执行后才能被执行,例如:
表3.sql
表1.sql
表7.sql 等等
我已经通过分析“show create table”mysql 命令的结果,从代码生成了每个表的依赖项列表。依赖项列表可能如下所示:
tblstate: tblcountry //tblcountry.sql must be executed before tblstate.sql etc
tblemployee: tbldepartment, tblcountry
Run Code Online (Sandbox Code Playgroud)
要生成 tableorder.txt 的内容,我需要一个如下所示的算法:
function print_table(table):
foreach table in database:
if table.dependencies.count == 0
print to tableorder.txt
if table.dependencies.count > 0
print_table(dependency) //print dependency first
end function
Run Code Online (Sandbox Code Playgroud)
正如您所想象的,这涉及大量递归。我开始怀疑这样的努力值得吗?如果有什么工具吗?有什么工具(或算法)可以生成执行单独的 .sql 表和视图的顺序列表,同时考虑依赖性?是对每个表/视图单独的 .sql 文件进行版本控制更好,还是对整个数据库进行版本控制到单个 .sql 文件更好?我将不胜感激任何回复,因为这已经花了很多天了。谢谢。