【发布时间】:2014-02-02 01:15:23
【问题描述】:
我的项目即将启动。我对启动后有很大的计划,并且数据库结构将发生变化——现有表中的新列以及新表,以及与现有模型和新模型的新关联。
我还没有接触过 Sequelize 中的迁移,因为我只有测试数据,我不介意在每次数据库更改时清除这些数据。
为此,如果我更改了模型定义,目前我的应用程序启动时正在运行sync force: true。这将删除所有表并从头开始创建它们。我可以省略 force 选项让它只创建新表。但是,如果现有的已经改变,这没有用。
那么,一旦我添加了迁移,事情会如何运作?显然我不希望现有的表(其中包含数据)被清除,所以sync force: true 是不可能的。在我帮助开发的其他应用程序(Laravel 和其他框架)上,作为应用程序部署过程的一部分,我们运行 migrate 命令来运行任何挂起的迁移。但在这些应用程序中,第一次迁移有一个框架数据库,该数据库处于开发早期的状态——第一个 alpha 版本或其他版本。因此,即使是迟到的应用实例也可以通过按顺序运行所有迁移来一次性加快速度。
如何在 Sequelize 中生成这样的“第一次迁移”?如果我没有,则应用程序的新实例将在某个方式下没有骨架数据库来运行迁移,或者它将在开始时运行同步并使数据库处于新状态新表等,但是当它尝试运行迁移时,它们就没有意义了,因为它们是用原始数据库和每次连续迭代编写的。
我的思考过程:在每个阶段,初始数据库加上顺序的每个迁移应该等于(加或减数据)sync force: true运行时生成的数据库。这是因为代码中的模型描述描述了数据库结构。所以也许如果没有迁移表,我们只是运行同步并将所有迁移标记为完成,即使它们没有运行。这是我需要做的(如何做?),还是 Sequelize 应该自己做,还是我在叫错树?如果我在正确的区域,肯定应该有一个很好的方法来自动生成大部分迁移,考虑到旧模型(通过提交哈希?或者甚至每个迁移都可以绑定到一个提交?我承认我在想在一个以 git 为中心的非便携式宇宙中)和新模型。它可以区分结构并生成将数据库从旧数据库转换为新数据库所需的命令,然后开发人员可以进行任何必要的调整(删除/转换特定数据等)。
当我使用 --init 命令运行 sequelize 二进制文件时,它给了我一个空的迁移目录。然后当我运行sequelize --migrate 时,它使我成为一个 SequelizeMeta 表,其中没有任何内容,也没有其他表。显然不是,因为该二进制文件不知道如何引导我的应用程序并加载模型。
我一定是错过了什么。
TLDR:如何设置我的应用及其迁移,以便可以更新实时应用的各种实例以及没有旧式起始数据库的全新应用?
【问题讨论】:
-
我已经回答了与您的工作流程有关的问题,但理想情况下,所有表都应使用迁移设置。即使您现在使用
sync,其想法是迁移“生成”整个数据库,因此依赖骨架本身就是一个问题。例如,Ruby on Rails 工作流程对所有事情都使用迁移,一旦你习惯了它就会非常棒。编辑:是的,我注意到这个问题已经很老了,但是鉴于从来没有一个令人满意的答案,人们可能会来这里寻求指导,我想我应该做出贡献。
标签: database node.js database-migration sequelize.js