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

时间:2012-10-18 16:13:23

标签: mysql git mysqldump

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

目标:

  1. 我想管理所有的mysql(v5.1 +)数据库定义 git,这样我就可以获得源代码控制的所有好处。
  2. 我想通过编辑脚本来定义对数据库的更改,以及 运行脚本,以便我可以编辑数据库定义 我选择的编辑器(vim),而不是mysql shell,或者是gui 应用
  3. 除此之外:我目前使用mysql shell,但是想使用vim来维护在shell中变得难以处理的例程和事件。

    安排:

    我将使用'--no-data'选项进行初始转储以获取我​​的初始脚本,但从那时起,我希望我的工作流程为:编辑脚本 - >提交 - >运行脚本而不是:执行对数据库的更改 - > dump 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 个答案:

答案 0 :(得分:1)

正如您所指出的,只有mysqldump ing对此无效。

通常,您需要将更改存储到数据库结构中。所以不要存储:

// 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()选项的脚本会更好,因此您的迁移可以运行前进(构建表,添加列)和后退< / strong>(删除列,删除表)。

您必须记住在之前运行向后脚本,检查出依赖于db更改的分支。