使用git版本化脚本的MYSQL开发工作流程

3

我相信类似的工作流程很常见,但在我的搜索中我没有找到任何记录的例子。

目标:

  1. 我想在git中管理所有mysql(v5.1+)数据库定义,以便我拥有源代码控制的所有好处。
  2. 我希望通过编辑脚本并运行脚本来定义对数据库的更改,以便我可以使用我选择的编辑器(vim)编辑数据库定义,而不是mysql shell或gui应用程序。

附注:我目前使用mysql shell,但希望使用vim来维护程序和事件,因为在shell中变得难以处理。

计划:

我将使用“--no-data”选项进行初始转储,以获取我的初始脚本,但此后我希望我的工作流程为:编辑脚本 -> 提交 -> 运行脚本,而不是:执行对数据库的更改 -> 转储ddl -> 提交。

注意事项:

如果我使用以下命令转储数据库:

mysqldump -u [user] -p [password] --no-data --routines > ddl.sql

它包括:

DROP TABLE IF EXISTS `[table]`; CREATE TABLE `[table]` ([table definition])

显然,如果我运行该脚本,它将销毁并重新创建表。我想要做的是,如果表存在,则使用定义更改更新表,否则使用定义创建表。我更喜欢在一个 [table]([table dfinition]) 块中定义表格,并重复使用它,而不是维护多个重复的块。

我该如何更改初始转储语法或脚本,以便我可以使用相同的脚本更新数据库,并在另一个环境中重新创建数据库定义(不包括数据)?

1个回答

1
正如您所指出的那样,仅使用mysqldump是无法解决这个问题的。
通常情况下,您需要存储数据库结构的更改。因此,不要仅仅存储:
// commit 1
// foo.sql
CREATE TABLE foo ( foo_id INT );

// commit 2
// foo.sql
CREATE TABLE foo ( foo_id INT, foo_val INT );

你应该存储更多类似于:

// commit 1
// foo_1.sql
CREATE TABLE foo ( foo_id INT );

// commit 2
// foo_2.sql
ALTER TABLE foo ADD COLUMN ( foo_val INT );

接下来,您应该拥有一个可以运行的脚本

  • foo_1.sql
  • foo_2.sql

按正确的顺序。

编写具有up()和down()选项的脚本会更好,这样您的迁移可以向前(构建表,添加列)和向后(删除列,删除表)运行。

您只需要记住在检出依赖于数据库更改的分支之前运行向后的脚本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接