我的项目马上就要启动了。我对启动后的数据库结构有很大的计划,数据库结构将发生变化——现有表中的新列和新表中的新列,以及与现有模型和新模型的新关联。
我还没有涉及到 Sequelize 的迁移,因为我只有测试数据,我不介意每次数据库改变的时候删除这些数据。
为此,目前我正在运行 sync force: true
时,我的应用程序启动,如果我已经改变了模型定义。这将删除所有表并从头开始创建它们。我可以省略 force
选项,让它只创建新表。但是,如果现有的已经改变,这是没有用的。
那么,一旦我加入迁移,事情是如何工作的呢?显然,我不希望清除现有的表(包含数据) ,因此 sync force: true
是不可能的。在我帮助开发的其他应用程序(Laravel 和其他框架)中,作为应用程序部署过程的一部分,我们运行了迁移命令来运行任何挂起的迁移。但是在这些应用程序中,第一次迁移有一个骨架数据库,数据库处于开发早期的状态——第一个 alpha 版本或者其他什么。因此,即使应用程序的一个实例迟到了,也可以通过按顺序运行所有迁移来一次性加快速度。
我如何在 Sequelize 产生这样的“首次移民”?如果我没有一个,一个新的应用程序实例或者没有骨架数据库来运行迁移,或者它会在开始运行同步,使数据库处于新的状态,包含所有新的表等等,但是当它尝试运行迁移时,它们就没有意义了,因为它们是根据原始数据库和每个连续的迭代编写的。
我的思考过程是: 在每个阶段,初始数据库加上按顺序进行的每次迁移应该等于运行 sync force: true
时生成的数据库(正负数据)。这是因为代码中的模型描述描述了数据库结构。因此,如果没有迁移表,我们可能只需要运行 sync,并将所有迁移标记为已完成,即使它们没有运行。这是我需要做的吗(怎么做?)还是应该由 Sequelize 自己来做,还是我找错人了?如果我在正确的地方,肯定有一个很好的方法来自动生成大部分迁移,给定的旧模型(提交散列?或者甚至可以将每次迁移都绑定到一个提交上?我承认我正在思考一个不可移植的以 git 为中心的世界)和新模型。它可以区分结构并生成将数据库从旧数据库转换为新数据库以及从新数据库转换回数据库所需的命令,然后开发人员可以进行任何必要的调整(删除/转换特定数据等)。
当我使用 --init
命令运行 Sequelize 二进制文件时,它会给我一个空的迁移目录。然后,当我运行 sequelize --migrate
时,它使我成为一个 SequelizeMeta 表,其中没有任何内容,没有其他表。显然不是,因为那个二进制文件不知道如何引导我的应用程序并加载模型。
我肯定漏掉了什么。
TLDR: 我如何设置我的应用程序及其迁移,使各种实例的活动应用程序可以更新,以及一个全新的应用程序没有遗留的启动数据库?