我即将准备好启动我的项目。在启动后,我有很大的计划,数据库结构也将发生变化-现有表中的新列以及新表,以及与现有模型和新模型的新关联。
我还没有接触过Sequelize中的迁移,因为我只有测试数据,所以我不介意在每次数据库更改时都清除掉这些数据。
为此sync force: true
,如果我更改了模型定义,则目前我正在运行我的应用程序。这将删除所有表并使它们从头开始。我可以忽略force
使它仅创建新表的选项。但是,如果现有的更改,这将无用。
因此,一旦添加迁移,事情如何工作?显然,我不希望删除现有表(其中包含数据),所以这sync force: true
是不可能的。在我帮助开发的其他应用程序(Laravel和其他框架)中,作为该应用程序部署过程的一部分,我们运行migration命令来运行所有待处理的迁移。但是在这些应用程序中,第一个迁移具有框架数据库,该数据库处于开发尚处于初期状态的状态-首次发布Alpha版本或其他内容。因此,即使是晚到派对的应用程序实例,也可以通过依次运行所有迁移,一口气掌握速度。
如何在Sequelize中生成这样的“首次迁移”?如果我没有,则该应用程序的新实例可能会没有骨架数据库来运行迁移,或者它将在开始时运行同步,并使所有数据库都处于新状态新表等,但是当它尝试运行迁移时,它们将变得毫无意义,因为它们是在原始数据库的基础上编写的,并且考虑到了每个连续的迭代。
我的思考过程:在每个阶段,初始数据库加上依次进行的每次迁移都应等于(正负数据)数据库, sync force: true
运行。这是因为代码中的模型描述描述了数据库结构。因此,也许即使没有迁移表,我们也可以运行同步并将所有迁移标记为完成,即使它们没有运行。这是我需要做的(如何?),还是应该由Sequelize自己做,还是我吠错了树?如果我在正确的区域,那么肯定会存在一种自动生成大部分迁移的好方法,考虑到旧模型(通过提交哈希?甚至每个迁移都可以与提交相关联?),我承认我在想在不可移植的以git为中心的世界中)和新模型。它可以改变结构并生成将数据库从旧版本转换为新版本所需的命令,然后再返回,然后开发人员可以进行必要的调整(删除/转换特定数据等)。
当我使用--init
命令运行sequelize二进制文件时,它给了我一个空的迁移目录。然后,当我运行sequelize --migrate
它时,我得到一个SequelizeMeta表,里面没有任何东西,没有其他表。显然不是,因为该二进制文件不知道如何引导我的应用程序和加载模型。
我肯定错过了什么。
TLDR:如何设置我的应用程序及其迁移,以便可以更新实时应用程序的各种实例,以及没有旧启动数据库的全新应用程序?
sync
,其思想是迁移“生成”了整个数据库,因此依赖框架本身就是一个问题。例如,Ruby on Rails工作流程对所有内容都使用了Migrations,一旦习惯了,它就很棒了。编辑:是的,我注意到这个问题已经很老了,但是鉴于从来没有令人满意的答案,人们可能会来这里寻求指导,所以我认为我应该有所作为。