gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:51:39 25 4
gpt4 key购买 nike

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

目标:

  1. 我想管理所有 mysql (v5.1+) 数据库定义git,以便我拥有源代码管理的所有好处。
  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]) block 中定义表,该 block 被重新使用,而不是必须维护多个重复 block 。

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

最佳答案

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

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

关于使用 git 版本化脚本的 MYSQL 开发工作流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12959059/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com