Loopback JS:重命名现有模型

4

我正在使用 Loopback API 框架,对此还比较陌生。

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

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

related-model.json

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

什么是重命名/重构模型的最佳方法,而不会丢失数据?我认为最好的方式不是手动登录到Mongo shell并逐个重命名,但我找不到任何其他方法。

1
没有简单的方法...你只能逐个浏览所有配置文件并进行更新。 - Jordan Kasper
谢谢Jakerella。我猜我还需要修改数据库中的关系?例如,如果RelatedModel属于OldModelName,则我必须将其应用于RelatedModel的所有文档:$rename { "oldModelNameId": "newModelNameId" }?或者我想另一种解决方法是修改related-model.json中的foreignKey,使其类似于旧名称? - Andre D
2个回答

1

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

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

现在Loopback代码已更新,Mongo DB必须相应地更新:

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();

有点紧张,但是在采取这些步骤并重新启动服务器后,一切都正常工作,除了一些我忘记更改命名的地方。这是我第一次在数据库中进行“重构”,希望我已经忽视了更容易的方法来完成此任务,但这是目前我想出的最好方法。


1

将我之前的评论放到回答中并添加更多内容...

这并不容易,您需要浏览所有配置文件并更新名称。(这包括在common/models中的文件以及server/model-config.json和其他任何引用模型名称的地方)

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

或者,您可以保留DB结构,只需在LoopBack端重命名模型,但仍需要在LoopBack中使用自定义外键名称,并使用data source specific options更新模型配置。


谢谢!我本来就怀疑我需要做所有这些事情。只是想确认在我大力破坏数据库之前,没有更好的方法。这是我的错,第一次没有给它命名一个合理的名称。干杯! - Andre D
请您看一下我的问题,链接在这里:http://stackoverflow.com/questions/39528371/loopback-error-authorization-required - shireef khatab

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接