Rails 5: Почему rails добавляет столбец в schema.rb, хотя я удалил файл миграции - PullRequest
0 голосов
/ 25 октября 2018

Я создал миграцию:

class AddFormCounterToUsers < ActiveRecord::Migration[5.2]
  def change
    add_column :users, :form_count, :integer, default: 0
  end
end

Я запустил rails db:migrate, но вскоре понял, что неправильно переименовал столбец.Поэтому я запустил git reset master --hard - чтобы файл миграции был удален и schema.rb был сброшен - и снова запустился:

class AddFormCounterToUsers < ActiveRecord::Migration[5.2]
  def change
    add_column :users, :forms_count, :integer, default: 0
  end
end

Но когда я запустил rails db:migrate на этот раз, не толькосоздан новый столбец, но также и старый.

  t.integer "form_count", default: 0
  t.integer "forms_count", default: 0

Ух?Поэтому я запустил rails db:rollback, чтобы посмотреть, сработает ли это.Но это приводит к ошибке: No migration with version number 20181025092233. Поскольку я не зафиксировал этот файл, я думаю, что нет способа восстановить его.

Где и почему эта миграция сохраняется?Какова лучшая практика при решении удалить и повторить миграцию?Какой лучший выход из этого рассола?Есть ли другой способ, кроме запуска rails db:reset?(Я использую Postgres.)

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Сначала сделайте резервную копию базы данных.Затем разверните базу данных (rake db:drop), после этого удалите свой schema.rb, а затем начните очистку проекта

rake db:schema:cache:clear
rake db:schema:cache:dump

Наконец, снова создайте базу данных

rake db:create
rake db:migrate

В большинстве случаев просто удалите «schema.rb», чтобы избежать ошибок такого рода.Всегда поддерживайте организацию проекта с помощью команд консольных направляющих.Оставьте Git для управления версиями вашего приложения.

0 голосов
/ 25 октября 2018

Я думаю, у вас есть два решения здесь.Либо заново создайте точный файл миграции, который вы уничтожили (с правильной отметкой времени), и вы сможете откатиться отсюда rails db:rollback и удалить его.Схема будет соответственно уничтожена.

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

rails dbconsole

Оказавшись в консоли

SELECT * FROM schema_migrations;

, вы увидите все временные метки от миграций, которые вы сделали в базе данных, ту, которую вы думали, что удалилиздесь тоже.Скопируйте отметку времени и:

DELETE FROM schema_migrations WHERE version=$yourtimestamp;

Выйдите из консоли базы данных и перезагрузите базу данных

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