我正在使用Loopback API框架,这是一个新手。
我有一个先前由Loopback创建的现有模型,我们称之为OldModelName
。我想将其重命名为NewModelName
。
我已有现有数据,其他多个模型已经引用它:
相关-model.json
"relations": {
"oldModel": {
"type": "belongsTo",
"model": "OldModelName",
"foreignKey": ""
}
}
在不丢失数据的情况下重命名/重构模型的最佳方法是什么?我不认为最好的方法是登录Mongo shell并手动重命名,但我不能挖掘任何能告诉我的东西。
答案 0 :(得分:1)
将我之前的评论放在答案中并添加一点......
没有简单的方法可以做到这一点,你只需要浏览所有配置文件并更新名称。 (包括common/models
以及server/model-config.json
以及您通过名称引用模型的任何其他地方的内容)
如果您已经持久存储数据,那么您遇到了更大的问题。例如,如果它是MySQL,则需要重命名外键字段并更新任何FK限制或触发器。如果它是Mongo,您将需要扫描相关连接以重命名该FK对象属性。
或者,您可以保留数据库结构,只需在LoopBack方面重命名模型,但您仍需要在LoopBack中使用自定义外键名称,并使用data source specific options更新模型配置。 / p>
答案 1 :(得分:1)
我终于有勇气做到这一点,这是我采取的步骤:
现在已经更新了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();
小小的神经紧张,但在采取这些步骤并重新启动服务器后,一切正常,除了一些地方我忘了更改命名。这是我第一次"重构"在数据库中的某些东西,希望我忽略了一个更简单的方法来做到这一点,但这是我迄今为止最好的。