© 2024 WebHive

Как я поборол ошибку Key column doesn't exist in table

Казалось бы знаешь уже рельсу вдоль и поперек, но внезапно банальная миграция подкинула седых волос. Дабы больше не ходить по этим граблям опишу всю боль ниже в назидание себе.

Итак ничего не предвещало и нужно-то было всего удалить связь между таблицами.

1
remove_column :earnings, :shipment_id

Любые способы удалить это поле в БД натыкались на сообщение, что такого поля нет.

1
2
3
4
rails aborted!
StandardError: An error has occurred, all later migrations canceled:

Mysql2::Error: Key column 'shipment_id' doesn't exist in table

Но как нет если оно таки есть? Это очевидная дезинформация. При этом как я проверил другие поля удалялись без проблем, то есть это не какая-то случайная проблема.

Естественно мысли начали двигаться в сторону индексов в БД, ибо больше зацепиться было не за что. И это было не зря. После долгих мытарств и экспериментов я таки нашел виновника моих злоключений.

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

1
add_index :earnings, %i[store_id line_item_id shipment_id], unique: true

После удаления поля из индекса, удаление самого поля прошло без проблем.

В общем конечно я таки виню в этой проблеме рельсу — сообщение об ошибке очевидно сбивало с толку и не соответствовало
реально возникшей проблеме.

Комментарии