Adonis.js: Как выполнить миграцию с обновлением данных?

Всем привет!

Создал три таблицы: client, pet и связующую client_pet. Однако идея поменялась и теперь необходимо изменить имеющееся отношение "многие ко многим" на "многие к одному" с сохранением ассоциаций.

Окей, вроде не сложно:

  1. Нужно добавить в pet столбец client_id, пока что nullable
  2. Далее выбрать всех питомцев, все связи и заполнить client_id каждого питомца (благо все они имеют только одного хозяина)
  3. Столбец client_id в pet сделать "ненуллабельным"
  4. Удалить таблицу client_pet

Сказано - сделано:

class PetSchema extends Schema {
  async up () {
    await this.table('pet', (table) => {
      table.integer('client_id').unsigned().after('id')
        .references('id').inTable('client')
        .onDelete('restrict').onUpdate('restrict')
    })

    const pets = await DB.table('pet').select()
    const assoc = await DB.table('client_pet').select()
    for (let i = 0; i < pets.length; i++) {
      const petId = pets[i].id
      for (let j = 0; j < assoc.length; j++)
        if (assoc[j].pet_id == petId) {
          await DB.table('pet')
            .where('id', petId)
            .update('client_id', assoc[j].client_id)
          break
        }
    }

    await this.table('pet', (table) => {
      table.alter('client_id').notNullable()
    })
  }

  down () {
    this.table('pet', (table) => {
      table.dropForeign('client_id')
      table.dropColumn('client_id')
    })
  }
}

Вроде всё логически верно и await-ами схвачено, но всё-равно средний код умудряется сработать раньше! И конечно же это ошибка, попытка обновить столбец client_id, которого ещё нет. Что с моим кодом может быть не так?


Ответы (0 шт):