您使用什么方法对数据库进行版本控制?我已将我们所有的数据库表作为单独的 .sql 脚本提交到我们的存储库(mercurial)。这样,如果团队中的任何成员对员工表进行了更改,例如,当我更新我的存储库时,我将立即知道哪个特定表已被修改。
这种方法在:What are the best practice for database scripts under code control 中有所描述。目前,我正在编写一个 python 脚本来执行数据库文件夹中的所有 .sql 文件,但是,由于外键约束导致的依赖问题确保我们不能只以任何顺序运行 .sql 文件。
python 脚本将生成一个文件,其中包含执行 .sql 文件的顺序。它将按照它们在 tableorder.txt 文件中出现的顺序执行 .sql 文件。一个表在其外键表被执行之前不能被执行,例如:
表顺序.txt
table3.sql
table1.sql
table7.sql 等等
通过解析“show create table”mysql 命令的结果,我已经从代码中生成了每个表的依赖关系列表。依赖项列表可能如下所示:
tblstate: tblcountry //tblcountry.sql must be executed before tblstate.sql etc
tblemployee: tbldepartment, tblcountry
要生成 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
正如您将想象的那样,这涉及大量递归。我开始怀疑这是否值得努力?如果那里有什么工具?考虑到依赖关系,有什么工具(或算法)可以生成执行单独的 .sql 表和视图的顺序列表?对每个表/视图分别控制单独的 .sql 文件更好,还是更好地将整个数据库版本控制为单个 .sql 文件?我将不胜感激任何回应,因为这已经花费了很多天。谢谢。