我离项目上线越来越近了。在项目上线后,我的大计划就是要改变数据库结构 -- 在现有表中增加新列,创建新表,并建立现有和新模型之间的新关联。
目前我只有测试数据,因此还没有涉及到Sequelize迁移。我每次更改数据库时都不介意清除测试数据,所以启动应用程序时我会运行sync force: true命令,如果我已经更改过模型定义。这将删除所有表格并从头开始创建它们。如果我忽略force选项,它只会创建新表格。但如果现有表格发生了变化,这就没用了。
那么,当我添加迁移时,情况会如何呢?显然,我不想清除已经存在(带有数据)的表格,因此,sync force: true已经不是可行的选择。在其他我参与开发的应用程序中(如Laravel和其他框架),作为应用程序部署过程的一部分,我们运行迁移命令来运行任何待处理的迁移。但在这些应用程序中,第一个迁移有一个框架数据库,其中的数据库状态为开发早期的某个时间点 -- 第一个alpha版本或其他版本。因此,即使是稍晚加入的应用程序实例也可以一次性运行所有迁移,并跟上步伐。
那么,我该如何在Sequelize中生成这样的“第一个迁移”呢?如果我没有这个迁移,那么在某个时候启动的新应用程序实例将没有框架数据库来运行迁移,或者它将在开始时运行同步并创建具有所有新表等的新状态数据库,但当尝试运行迁移时,由于它们是为原始数据库和每个后续迭代编写的,所以它们就不再有意义了。
我的思维过程是:在每个阶段,初始数据库加上每个迁移序列应等于(加上或减去数据)运行sync force: true 时生成的数据库。这是因为代码中的模型描述描述了数据库结构。所以,如果没有迁移表,我们只需运行同步并标记所有迁移为已完成,即使它们没有运行也可以。这是我需要做的吗(如何?),还是 Sequelize 应该自己做这个,或者说我走错了路?如果我在正确的领域,那么肯定应该有一种很好的方法来自动生成大部分迁移,给定旧模型(按提交哈希值?或甚至每个迁移都可以与提交相关联?我承认我在一个非便携式的 git-centric 宇宙中思考),和新模型。它可以比较结构并生成需要从旧到新转换数据库的命令,然后开发人员可以进行任何必要的调整(删除/转换特定数据等)。
当我使用 --init 命令运行 sequelize 二进制文件时,它会给我一个空的迁移目录。然后当我运行 sequelize --migrate 时,它会让我创建一个名为 SequelizeMeta 的表,里面什么也没有,也没有其他表。显然不是因为那个二进制文件不知道如何引导我的应用程序并加载模型。
我一定是漏了什么。
简而言之:我应该如何设置我的应用程序及其迁移,以便将各种实例的实时应用程序更新到最新状态,以及没有遗留起始数据库的全新应用程序?


sync,迁移的想法是“生成”整个数据库,所以依赖骨架本身就是一个问题。例如,Ruby on Rails工作流程使用迁移来完成所有事情,一旦你习惯了它,它就非常棒。编辑:是的,我注意到这个问题很旧,但是考虑到从未有过令人满意的答案,而且人们可能会来这里寻求指导,我觉得我应该做出贡献。 - Fernando Cordeiro