Php Symfony 2+;由于实体更改,条令迁移无法通过变更集运行

Php Symfony 2+;由于实体更改,条令迁移无法通过变更集运行,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我们有一个应用程序,通过标记版本发布到生产环境中 我们希望始终能够通过条令迁移从最初发布的版本一直到最新的提交版本。我们还希望在剪切标记时创建结构的转储,并在运行迁移之前导入该结构 如果1.0已被剪切并发布到生产环境中,我们希望从该数据库快照开始开发我们的开发环境,并从该数据库快照向上移动。我们这样做的原因是,除非我们专门检查该版本的git标记,然后运行迁移,然后转到下一个标记并执行相同的操作,否则我们将始终使用当前代码的实体结构 最初,我们认为这会很好地工作——我们将始终匹配产品,并且能够从零

我们有一个应用程序,通过标记版本发布到生产环境中

我们希望始终能够通过条令迁移从最初发布的版本一直到最新的提交版本。我们还希望在剪切标记时创建结构的转储,并在运行迁移之前导入该结构

如果
1.0
已被剪切并发布到生产环境中,我们希望从该数据库快照开始开发我们的开发环境,并从该数据库快照向上移动。我们这样做的原因是,除非我们专门检查该版本的git标记,然后运行迁移,然后转到下一个标记并执行相同的操作,否则我们将始终使用当前代码的实体结构

最初,我们认为这会很好地工作——我们将始终匹配产品,并且能够从零开始将数据库升级到与产品相匹配的数据库,应用未标记的更改,并且知道产品将能够安全地迁移到一个版本

问题是,如果Symfony实体在初始版本和最新提交之间发生了更改,那么由于当前实体中存在新的(或更改/删除的)列,尝试逐步执行迁移路径将失败

例如,假设初始版本
user
表如下所示:

| id | first_name | last_name |
|----|------------|-----------|
然而,此后的变化增加了一个中间名:

| id | first_name | middle_name | last_name |
|----|------------|-------------|-----------|
由于Symfony将使用当前实体类代码进行迁移,并且前面的标记中不存在
中间名称
列,因此此操作将失败


除了创建一个脚本来运行
git checkout{tag_name}
命令、运行迁移并重复所有已识别的标记之外,我们还需要哪些选项才能从版本
x.x
到版本
y.y

理论迁移比较理论架构和数据库,然后产生一个差异。您到底遇到了什么问题?@zerkms如果我们只在新应用程序上运行迁移,这可能会很好。然而,我们过程的一部分是发布一个带有一些样本数据的项目。将来的迁移将通过编辑这些数据的值来影响这些数据(例如,我们将角色名称从“ADMIN”更改为“SUPERADMIN”)或更改表结构。要完全确信迁移路径会起作用,我们需要对数据库进行sed,然后使用迁移修补程序将数据安装到位。但是,由于表列之间的不匹配,数据中断了迁移。实际上存在什么问题?迁移工作正常,必须手动管理数据在任何情况下都是“y”。@zerkms手动管理数据允许引入人为错误。如果我们可以从
1.0
的结构和初始数据开始,然后对结构和数据应用修补程序,直到达到当前状态,我们可以100%确定迁移会成功;回去玩弄旧数据会破坏这种信心。你不能解决这个问题:数据的语义只存在于我们的头脑中(和文档中).Doctrine迁移比较Doctrine架构和数据库,然后产生差异。您到底有什么问题?@zerkms如果我们只在新应用程序上运行迁移,这可能会很好。但是,我们的部分过程是发布一个包含一些示例数据的项目。将来的迁移将通过编辑这些数据的值来影响这些数据(假设我们将角色名称从“ADMIN”更改为“SUPERADMIN”或更改表结构。要完全确信迁移路径会起作用,我们需要对数据库进行sed,然后使用迁移修补程序将数据安装到位。但是,由于表列之间的不匹配,数据中断了迁移。实际上存在什么问题?迁移工作正常,必须手动管理数据在任何情况下都是“y”。@zerkms手动管理数据允许引入人为错误。如果我们可以从
1.0
的结构和初始数据开始,然后对结构和数据应用修补程序,直到达到当前状态,我们可以100%确定迁移会成功;回去玩弄旧数据会破坏这种信心。你不能解决这个问题:数据的语义只存在于我们的大脑(和文档)中。