2016-01-28 2 views
3

Я использую API-интерфейс Loopback API, довольно новый для него.Loopback JS: переименовать существующую модель

У меня есть существующая модель, которая была ранее создана Loopback, назовем ее OldModelName. Я хочу переименовать его в NewModelName.

Я уже существующие данные и несколько другие модели уже ссылаться на него:

связанного model.json

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

Что такое лучший способ переименовать/реорганизовать модель без потери данных? Я не думаю, что лучший способ - войти в оболочку Mongo и переименовать все вручную, но я не могу выкопать все, что скажет мне иначе.

+1

Нет простого способа ... вам просто нужно пройти через все файлы конфигурации и обновить его. – jakerella

+0

Спасибо Jakerella. Я предполагаю, что мне нужно также изменить отношения в базе данных? Например, если RelatedModel принадлежит OldModelName, тогда я должен применить это ко всем документам RelatedModel: $ rename {"oldModelNameId": "newModelNameId"}? Или я предполагаю, что другим способом решить это будет изменение foreignKey в related-model.json, чтобы оно напоминало старое имя? –

ответ

1

Положив мой предыдущий комментарий в ответе, и добавив немного больше ...

Там нет простого способа сделать это, вам просто нужно пройти через все конфигурационные файлы и изменить имя. (В том числе те, что указаны в common/models, а также server/model-config.json и где-либо еще вы ссылаетесь на модель по имени)

Если у вас уже есть данные настойчиво сохранены, значит, у вас есть большая проблема. Например, если это MySQL, вам нужно переименовать поля внешнего ключа и обновить любое ограничение или триггеры FK. Если это Mongo, вам нужно будет прокрутить связанные соединения, чтобы переименовать это свойство объекта FK.

В качестве альтернативы вы можете сохранить структуру БД и просто переименовать модель на стороне LoopBack, но вам все равно нужно использовать имя пользовательского внешнего ключа в LoopBack и обновить конфигурацию модели с помощью data source specific options.

+0

Спасибо! У меня было подозрение, что мне нужно будет все это сделать. Просто хотел подтвердить, что не было лучшего способа, прежде чем я разрываю базу данных. Обслуживает меня правильно, не называя его чем-то нормальным в первую очередь. Ура! –

+0

Прошу вас, пожалуйста, взглянуть на мой вопрос здесь; http://stackoverflow.com/questions/39528371/loopback-error-authorization-required –

0

я, наконец, получил мужество, чтобы сделать это, и вот шаги, которые я взял:

  1. Резервное копирование базы данных
  2. убить сервер
  3. Редактировать модель-config.json
  4. Редактировать определение модели JSON и модель JS (old-model.json & old-model.js). Не забудьте переименовать их в новый-model.json и т.д.
  5. Редактировать все отношения/связанные модели
  6. редактировать все загрузочные скрипты/операции Крючков/и т.д.

Теперь, когда код Loopback был обновлен, Монго 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(); 

Маленький nervewracking, но после принятия этих мер и перезагрузки сервера, все работало нормально, за исключением нескольких мест, где я забыл изменить именование. Это был мой первый «рефакторинг» чего-то в базе данных, и, надеюсь, я упустил гораздо более простой способ сделать это, но это лучшее, что я придумал до сих пор.

Смежные вопросы