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]) 块中定义表,即重复使用,而不是必须维护多个重复块。

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

4

1 回答 1

1

正如您所指出的,只是mysqldumping 对此不起作用。

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

// 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() 选项的脚本,这样您的迁移可以向前(构建表、添加列)和向后(删除列、删除表)运行。

在签出依赖于 db 更改的分支之前,您只需要记住运行反向脚本。

于 2012-10-19T01:01:48.673 回答