Php 如何在不迁移特定框架的情况下进行数据库版本控制?

Php 如何在不迁移特定框架的情况下进行数据库版本控制?,php,mysql,database,version-control,version-control-migration,Php,Mysql,Database,Version Control,Version Control Migration,我知道迁移是对数据库模式进行版本控制的一种方法。然而,由于我有一个由多个项目共享的数据库,每个项目可能会稍微改变模式。所以,对于代码,我需要像git这样的分支和合并函数,而迁移不能提供这样的函数。那么,是否有专门针对数据库的版本控制工具 我们将php与laravel和mysql一起用于数据库,如果需要,我们愿意切换到postgresql。是一个可以使用的数据库版本控制应用程序。是一篇由Sitepoint撰写的关于如何使用它的文章。您可以在git存储库中为项目设置所有设置.sql文件。因为您提到许

我知道迁移是对数据库模式进行版本控制的一种方法。然而,由于我有一个由多个项目共享的数据库,每个项目可能会稍微改变模式。所以,对于代码,我需要像git这样的分支和合并函数,而迁移不能提供这样的函数。那么,是否有专门针对数据库的版本控制工具


我们将php与laravel和mysql一起用于数据库,如果需要,我们愿意切换到postgresql。

是一个可以使用的数据库版本控制应用程序。是一篇由Sitepoint撰写的关于如何使用它的文章。

您可以在git存储库中为项目设置所有设置
.sql
文件。因为您提到许多项目使用此数据库,所以最好只为数据库使用一个存储库:

假设以下目录由git管理:

setup.php
setup/
----- Create_database.sql
----- Create_users_table.sql
----- Create_posts_table.sql
----- Create_some_view.sql

setup.php
现在可以用来执行setup目录中的所有
.sql
文件,使数据库更易于部署/克隆。当您需要对数据库进行更改时,只需使用git中已内置的功能将更改分支并合并到此存储库中。

如上所述,企业级工具很多。就我个人而言,我想创造一个自己的。我使用api dbdeploy

它的工作原理是:编写增量脚本 1_c_table_t.sql 2_c_uk_index_t.sql ... 它需要在数据库中存储所有文件号的表。成功插入sql后,它会在版本表中进行插入

我在github中创建了一个repo,所有开发人员的repo都依赖于此。api使用第一个数字来标识脚本


感谢

我在一家公司工作,该公司在我们的源代码管理服务器上有钩子,它在提交时会运行一个脚本,它的核心是从我们的开发和登台数据库创建一个mysql模式转储,从这些模式之间的差异,它会创建一个sql脚本,如果运行该脚本,将允许第三个数据库(登台的副本)要修改以生成与dev具有相同模式的数据库,但包含登台上的所有数据。随后,它将运行所有测试,如果测试成功,它将显示sql增量脚本,以便在生产环境中安全运行。
只要您有一个事件,此时您可以运行一个脚本,您同样可以生成一个sql脚本,将模式向前移动到新的增量。

另一种方法是在每次更改时在版本控制中跟踪sql模式,但这意味着需要一个人(从统一的diff)计算出实现更改所需的sql

您可以尝试我目前使用的dbv.php,如另一个答案中所述,但Phinx似乎有更高级的选项,可以帮助您实现目标。这里可以找到文档,还有作者的一个示例项目演练

答案很简单。只需使用指定db模式的
.sql
文件即可。分支并根据需要修改.sql文件。您可以指定任何需要的内容,如创建数据库和表

如果您需要开始做一些事情,您可以在数据库上执行
mysqldump
,然后开始。在源代码管理中拥有文件之后,分支和合并就很简单了


另一个选项是创建基本db转储,然后使用各种alter脚本来定制db以满足您的需要。让不同的项目加载数据库转储,然后应用适当的脚本。

使用Phinx之类的工具,您可以拥有更多的选项和功能。链接到github repository

我建议您选择将嵌入部署的数据库源代码管理(即生成部署脚本)并且还可以根据任务管理系统中的任务执行此操作。堆栈溢出社区通常不赞成使用指向第三方工具的链接来回答问题。如何处理添加列或删除列?每当您需要添加列或删除列时,删除表并重新生成会很痛苦。@user1273587,除非您尝试复制数据库中存储的所有数据(在这种情况下,您可以添加一个
insert_data.sql
文件),否则我看不出这会有多痛苦。这样做的目的是能够在新机器上从头开始创建数据库,或者恢复到以前的模式。我会修改前者的
Create_tables.sql
,并为现有数据库发出
ALTER
语句。我会说这与我想要的最接近,但同时这个答案表明,如果我想要函数,我只能写我自己的。是的,但是从两个模式生成sql增量脚本并不困难,如果您有一个钩子可以在正确的时间执行shell脚本。可能有一些工具或脚本可以生成增量,或者让您完成大部分工作。mysqldump将以可预测的格式为您提供模式,如果您关闭数据部分和特定于mysql的选项,剩下的内容相对容易解析。如果您必须自己编写脚本,请记住,如果您在同一mysql服务器上从同一转储创建两个数据库,那么在生成新的模式转储时,他们将以同样的方式订购。只要您只添加到模式中(以相同的顺序),并且不删除/重新加载其中一个而不删除/重新加载另一个,它们将以相同的方式保持顺序,因此模式可以像节中的字符串文件一样进行比较。最快的方法是生成一个diff,然后解析该diff以从模式中获得适当的位,但它也可能是最复杂的脚本。最简单的方法可能是编写脚本生成一个CREATE TABLE函数列表和行号,从而生成