我确信类似的工作流程很常见,但在我的搜索中,我没有找到任何记录的例子。
目标:
除此之外:我目前使用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])块中定义表,这个块被重用,而不是必须维护多个重复的块。
如何更改初始转储语法或脚本,以便我可以使用相同的脚本更新数据库,并在另一个环境中重新创建数据库定义(无数据)?
答案 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 );
然后,你应该有一个可以运行的脚本
按正确的顺序。
编写具有up()和down()选项的脚本会更好,因此您的迁移可以运行前进(构建表,添加列)和后退< / strong>(删除列,删除表)。
您必须记住在之前运行向后脚本,检查出依赖于db更改的分支。