Миграция рельсов изменила несвязанные колонны - PullRequest
0 голосов
/ 08 мая 2019

Я запустил миграции, которые никак не касались данной таблицы. После его запуска были удалены 3 внешних ключа, которые ссылаются на эту таблицу, а соответствующие столбцы изменились с bigints на целые числа.

Это привело к ситуации, когда

  • У меня запущено приложение с колонками A, B, C в качестве bigints с внешними ключами,
  • У меня есть миграции, которые устанавливают их как bigints и внешние ключи,
  • У меня нет миграции, которая удаляет эти внешние ключи и
  • У меня нет миграции, которая превращает их из bigints в целые числа и
  • Мой schema.rb определяет их как целые числа в моем коммите (зафиксирован до того, как я понял ошибку)

пример:

# the most recent migration related to the column
# but an old one (not only executed on dev branch)
def up
  # ...
  change_column :abc, :table_a_id, :bigint
  # ...
# development db/schema.rb
# ...
create_table "abc", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
  t.integer "table_a_id"
# ...
# production db/schema.rb
# ...
create_table "abc", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
  t.bigint "table_a_id"
# ...
add_foreign_key "abc", "table_a"
# ...

Я запустил rails db:reset, и ничего не изменилось.

AFAIK, я не могу создать миграции, чтобы исправить эти изменения, так как такие миграции потерпят неудачу в производстве. Это правильно? Если это так, что я могу сделать, чтобы спасти коммит и предотвратить его повторение? Могу ли я вручную вернуть schema.rb? И почему / как это произошло?

1 Ответ

1 голос
/ 08 мая 2019

Полезная информация об откате миграций:

Как откатить конкретную миграцию?

Короче говоря, да, вы можете сбросить структуру базы данных и схемыФайл .rb.Вы можете потерять любые данные из столбцов, которые вы удалили, однако, если вы хотите, чтобы ваш файл schema.rb выглядел правильно, чтобы он проходил через все ловушки перед развертыванием, а затем откатывался и сбрасывал файл schema.rb:

rake db:rollback

Вернет вашу последнюю миграцию.Если эта миграция не является вашей проблемой, попробуйте:

rake db:migrate:down VERSION=20100905201547

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

rake db:schema:dump

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

git checkout db/schema.rb

И вы получите последнюю версиюdb / schema.rb, который был перенесен в ветку, над которой вы работаете.Или альтернативно:

git checkout origin/master db/schema.rb

Чтобы сбросить файл schema.rb в master.До тех пор, пока вы не отправите какие-либо прерванные миграции, и ваш файл schema.rb в порядке, вы никому ничего не сломаете

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...