Sle*_*der 6 python mysql database controls version
您使用什么方法对数据库进行版本控制?我已将所有数据库表作为单独的 .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 文件更好?我将不胜感激任何回复,因为这已经花了很多天了。谢谢。
我不确定这能很好地回答你的问题,但我倾向于只使用 mysqldump (标准安装的一部分)。这为我提供了创建表并填充它们的 sql,从而有效地序列化数据库。例子:
> mysqldump -u username -p yourdatabase > database_dump.sql
Run Code Online (Sandbox Code Playgroud)
要从转储 sql 文件加载数据库:
mysql -u 用户名 -p -e "源/path/to/database_dump.sql"
为了进一步回答您的问题,只有当有多个人在数据库上工作时,我才会单独对每个表进行版本控制,这样只有一个转储受到版本控制时就可能发生冲突。我从来没有遇到过这种情况的项目(在项目的初始阶段之后,数据库往往是系统中最不稳定的部分之一),所以我只是将数据库转储作为一个整体而不是每个数据库进行版本控制单独表。
| 归档时间: |
|
| 查看次数: |
3350 次 |
| 最近记录: |