我正在考虑在提交更改之前使用 git pre-commit 挂钩导出 MySQL 数据库模式,以便其他开发人员可以使用 git repo 中的 SQL 脚本更新他们自己的数据库。
默认情况下,mysqldump(我正在使用--no-data)将在重建现有表之前删除它们,这不是我想要的。我想知道是否有人知道一种方法来执行 mysqldump 或类似的方法来使用 SQL 描述数据库模式以更新表(如果它们存在而不是删除和重建)。我意识到这可能是一个长镜头,但如果有人能指出我正确的方向,那就太好了。
我正在考虑在提交更改之前使用 git pre-commit 挂钩导出 MySQL 数据库模式,以便其他开发人员可以使用 git repo 中的 SQL 脚本更新他们自己的数据库。
默认情况下,mysqldump(我正在使用--no-data)将在重建现有表之前删除它们,这不是我想要的。我想知道是否有人知道一种方法来执行 mysqldump 或类似的方法来使用 SQL 描述数据库模式以更新表(如果它们存在而不是删除和重建)。我意识到这可能是一个长镜头,但如果有人能指出我正确的方向,那就太好了。
MySQL 怎么知道要更新什么?它不知道其他人的数据库将处于什么状态,因此它不知道要应用哪些更新。此外,更新频繁需要的不仅仅是更改架构;他们可能需要更改已经存在的数据,或者可能需要将数据从旧模式移动到新模式。你永远不会得到可以自动检测到所有这些的东西。
正确的解决方案是编写迁移。每次更改数据库时,您不仅要自己更改开发副本的架构,还要编写一个脚本来从以前的架构更新到新的架构(通常是一个脚本来降级回以前的架构,所以你可以这样做如果您需要回滚更新)。该脚本会执行您更改架构、移动数据等所需的任何操作。
大多数现代 Web 框架,例如Ruby on Rails,都支持迁移,以便更轻松地跟踪您已经运行的迁移。如果您没有使用支持迁移的框架,那么编写自己的脚本来应用迁移并不会太难。只需对每次迁移进行编号,或在其中输入日期,并在数据库中保留一张表,仅存储您所在架构的当前版本。当您运行迁移脚本时,如果有任何比当前版本更新的迁移,请按顺序应用这些脚本,然后更新数据库中说明您使用的版本的数字。