我正在使用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 中使用自定义外键名称,并使用数据源特定的选项更新模型配置。
我终于有勇气这样做了,以下是我采取的步骤:
- 备份数据库
- 杀死服务器
- 编辑模型配置.json
- 编辑模型定义JSON和模型JS(old-model.json和旧模型.js)。 请务必将它们重命名为 new-model.json 等
- 编辑所有关系/相关模型
- 编辑所有引导脚本/操作钩子/等
现在环回代码已更新,必须相应地更新 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();
有点伤脑筋,但是在采取这些步骤并重新启动服务器后,一切正常,除了几个地方我忘记更改命名。这是我第一次在数据库中"重构"某些东西,希望我忽略了一种更简单的方法,但这是我迄今为止想出的最好的方法。