Неприятная проблема с миграциями в MySQL
Столкнулся с такой очень неприятной штукой на днях.
Дорабатывал я приложение у себя на локальном компе, соответственно, с development-базой на SQLite. Сделал миграцию, настроил, проверил. Всё хорошо.
Запушил на production-сервер. Пытаюсь применить миграцию (production-база на 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 типа референса примерно так:
Произошло это, скорей всего, из-за того, что пару недель назад переехал с 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 . . .
Такие дела.