0

を保留中として移行を示しています。私はレールを実行しているサーバーから切断されたRailsの移行が完了し表示されますが、熊手はまだ私がテーブルに列を追加するために大規模なMySql2のDB上の簡単なレールの移行を実行した

class AddMiddleNameToPerson < ActiveRecord::Migration[5.0] 
    def change 
    add_column :person, :middle_name, :string 
    end 
end 

アプリをインストールします。私は、ダウンとしてそれを示した0​​と移行ステータスを、再接続してチェック:

down 20170424182410 Add middle name to person 

、私はそれがまだバックグラウンドで実行されたと仮定します。だから私はしばらくそれを去り、最終的にはレールコンソールを使ってperson.middle_nameがオブジェクト上でアクセス可能であることを確認しました。しかし、db:migrate:statusはまだダウンして移行を示しており、私は再びdb:migrateを実行しようとした場合、私はエラーを取得する:

Mysql2::Error: Duplicate column name 'middle_name' 

だから、新しい列がデータベースにあると思われ、そしてActiveRecordを介してアクセス可能な、しかしrake db:migrate:status発見downrake db:migrateのような移行では、再実行が試行されませんでした。

答えて

1

これは本番データベース(または重要なデータと他のデータベース)の場合、は、そのデータベースをドロップしますないrake db:resetないとして、あなたはすべてを失うことになります。 db:migrate:downと入力しないと、middle_nameの列が削除され、既に持っているミドルネームを失います。

最初にデータベースのバックアップを取得するか、少なくとも作業しているテーブルを取得してください。

第2に、mysql CLIツールを使用してデータベースに接続し、describe people;と言う。あなたの質問の情報は、そこにmiddle_nameの列が表示されることを示唆していますが、正しいデータベースに接続していることを確認するのに害はありません。 middle_nameが存在しない場合は間違ったデータベースに接続している可能性がほとんどあります。存在する場合は、マイグレーションの問題を解決するだけです。

移行が完了する前にデータベース接続が切断されたとします。移行は次の順序で行われます。

  1. 移行を実行してデータベースを更新します。
  2. schema_migrationsテーブルに移行のバージョン番号を記録します。
  3. db/schema.rbまたはdb/structure.sqlを再生成します。

完了したが、接続が失われたが、その後は決して起こらない場合ので、移行が実行されているだろうが、Railsはそれを知ることができません。

他の環境では、あなたは、単に新鮮schema.rbまたはstructure.sqlを取得するには、移行とrake db:schema:dumpまたはrake db:structure:dumpを削除することができ、その後の移行を必要としない場合。マイグレーションは、AからBへの移行のための一時的なコードです。どこでも実行された後に削除することは問題ありません。長期的に重要なのはデータベース構造(db/schema.rbまたはdb/structure.sql)です。

他の環境で移行を実行する必要がある場合は、schema_migrationsテーブルを手動でパッチできます。 mysql CLIツールを使用してデータベースに接続し、insert into schema_migrations (version) values ('20170424182410');と答えてください。 Railsは移行が実行され、将来のrake db:migrate呼び出しがうまくいくことを認識します。次に、schema.rbrake db:schema:dump)またはstructure.sqlrake db:structure:dump)をリフレッシュするとします。


おそらく、(実行されたマイグレーションのバージョン番号を含む)、データベースの構造を追跡するためのdb/schema.rbファイルを持っています。そうする場合は、rake db:schema:dumpを使用して再生成します。 db/structure.sqlがある場合は、rake db:structure:dumpを使用します。

+0

これを解決するためにこれに似た何かをやってしまった。受諾する。 – wildabeast

関連する問題