19 Июн

Неприятная проблема с миграциями в MySQL

Столкнулся с такой очень неприятной штукой на днях.
Дорабатывал я приложение у себя на локальном компе, соответственно, с development-базой на SQLite. Сделал миграцию, настроил, проверил. Всё хорошо.
Запушил на production-сервер. Пытаюсь применить миграцию (production-база на MySQL), а мне выдает следующую ошибку:
#:/var/www/project# RAILS_ENV=production rails db:migrate
/usr/local/rvm/rubies/ruby-2.4.0/bin/ruby: warning: shebang line ends with \r may cause a problem
== 20170617124016 CreateDashboards: migrating =================================
-- create_table(:dashboards)
rails aborted!
StandardError: An error has occurred, all later migrations canceled:

Mysql2::Error: Table 'dashboards' doesn't exist: SHOW FULL FIELDS FROM `dashboards`
/usr/local/rvm/gems/ruby-2.4.0/gems/mysql2-0.4.6/lib/mysql2/client.rb:120:in `_query'
/usr/local/rvm/gems/ruby-2.4.0/gems/mysql2-0.4.6/lib/mysql2/client.rb:120:in `block in query'
. . .
Ну и так далее ошибок на экрана четыре.
Что ж, гуглим. Сначала ничего непонятно, какая-то фигня вообще. С наскока решить не получилось.
Спустя полчаса гугления оказалось следующее. В этой таблице dashboards у меня был референс на другую таблицу (которая была создана пару месяцев назад). И проблема в том, что тип поля этого референса не совпадал с типом поля id в родительской таблице. Тип поля референса был bigint, в то время как тип родительского поля был int.
Произошло это, скорей всего, из-за того, что пару недель назад переехал с Rails 5.0.1 на Rails 5.1.0 (ну и версию Ruby пришлось поднять с 2.3.1 до 2.4.0). А в новой версии рельс, судя по всему, для id и для референсов используется bigint вместо int.
В итоге исправил проблему ручным прописыванием в миграции для создания таблицы dashboards типа референса примерно так:
 class CreateDashboards < ActiveRecord::Migration[5.1]
  def change
    create_table :dashboards do |t|
      t.references :hosp, type: :integer, foreign_key: true
      t.integer :day_count
. . .
Такие дела.