仅限mysqldump模式,模式更新不删除

仅限mysqldump模式,模式更新不删除,mysql,git,hook,mysqldump,pre-commit,Mysql,Git,Hook,Mysqldump,Pre Commit,我正在考虑使用git pre-commit钩子在提交更改之前导出MySQL db模式,以便其他开发人员可以使用git repo中的SQL脚本更新自己的数据库 默认情况下,mysqldump(我使用的是--no data)将在重建现有表之前删除它们,这不是我想要的。我想知道是否有人知道如何使用mysqldump或类似的方法来描述数据库模式,以更新表(如果存在),而不是删除和重建。我意识到这可能很难实现,但如果有人能给我指出正确的方向,那就太好了。MySQL怎么知道要更新什么?它无法知道其他人的数据

我正在考虑使用git pre-commit钩子在提交更改之前导出MySQL db模式,以便其他开发人员可以使用git repo中的SQL脚本更新自己的数据库


默认情况下,mysqldump(我使用的是--no data)将在重建现有表之前删除它们,这不是我想要的。我想知道是否有人知道如何使用mysqldump或类似的方法来描述数据库模式,以更新表(如果存在),而不是删除和重建。我意识到这可能很难实现,但如果有人能给我指出正确的方向,那就太好了。

MySQL怎么知道要更新什么?它无法知道其他人的数据库将处于何种状态,因此无法知道要应用哪些更新。此外,更新经常需要的不仅仅是更改模式;它们可能需要更改已经存在的数据,或者可能需要将数据从旧模式移动到新模式。你永远不会得到自动检测所有这些的东西

正确的解决方案是编写迁移。每次更改数据库时,您都要编写一个脚本,从以前的模式更新到新模式(通常是一个脚本,降级回以前的模式,因此如果需要回滚更新,您可以这样做),而不是自己更改开发副本的模式。该脚本可以执行更改模式、移动数据等所需的任何操作

大多数现代web框架(如)都支持迁移,以便更容易跟踪您已经运行的迁移。如果您没有使用支持迁移的框架,那么编写自己的脚本来应用迁移也不会太困难。只需对每次迁移进行编号,或在其中输入日期,并在数据库中保留一个表,仅存储当前模式版本。运行迁移脚本时,如果有比当前版本更新的迁移,请按顺序应用这些脚本,然后更新数据库中的编号,该编号表示您所使用的版本