环回 JS:重命名现有模型



我正在使用Loopback API框架,这是很新的。

我有一个以前由 Loopback 创建的现有模型,我们称之为 OldModelName .我想将其重命名为 NewModelName .

我已经有现有数据,并且多个其他模型已经引用了它:

相关模型.json

  "relations": {
    "oldModel": {
      "type": "belongsTo",
      "model": "OldModelName",
      "foreignKey": ""
    }
  }

在不丢失数据的情况下重命名/重构模型的最佳方法是什么?我不认为最好的方法是登录 Mongo shell 并手动重命名所有内容,但我无法挖掘出任何可以告诉我其他情况的东西。

将我之前的评论放在答案中并添加更多...

没有简单的方法可以做到这一点,您只需要浏览所有配置文件并更新名称即可。(这包括common/models中的那些,但也包括server/model-config.json和您按名称引用模型的任何其他位置)

如果您已经永久存储了数据,那么您将面临更大的问题。例如,如果是 MySQL,则需要重命名外键字段并更新任何 FK 限制或触发器。如果是 Mongo,则需要扫描相关连接以重命名该 FK 对象属性。

或者,您可以保留数据库结构,只需在 LoopBack 端重命名模型,但仍需要在 LoopBack 中使用自定义外键名称,并使用数据源特定的选项更新模型配置。

我终于有勇气这样做了,以下是我采取的步骤:

  1. 备份数据库
  2. 杀死服务器
  3. 编辑模型配置.json
  4. 编辑模型定义JSON和模型JS(old-model.json和旧模型.js)。 请务必将它们重命名为 new-model.json 等
  5. 编辑所有关系/相关模型
  6. 编辑所有引导脚本/操作钩子/等

现在环回代码已更新,必须相应地更新 Mongo 数据库:

mongo>
//Make sure the new collection we are migrating to is empty
db.NewCollection.drop();
//Copy all entries from OldCollection to NewCollection
db.OldCollection.find().forEach( function(x){db.NewCollection.insert(x)} );
//Update relations, for hasOne related models
db.RelatedCollection.update( {}, { $rename: { 'oldCollectionId': 'newCollectionId'} }, { multi: true} );
//Update relations, for hasAndBelongsToMany related models
db.NewCollectionRelatedCollection.drop();
db.OldCollectionRelatedCollection.find().forEach( function(x){db.NewCollectionRelatedCollection.insert(x)} );
db.NewCollectionRelatedCollection.update( {}, { $rename: { 'oldCollectionId': 'newCollectionId'} }, { multi: true} );
//Feeling confident?
db.OldCollection.drop();
db.OldCollectionRelatedCollection.drop();

有点伤脑筋,但是在采取这些步骤并重新启动服务器后,一切正常,除了几个地方我忘记更改命名。这是我第一次在数据库中"重构"某些东西,希望我忽略了一种更简单的方法,但这是我迄今为止想出的最好的方法。

最新更新