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