0

環境

ruby 1.9.3p194 (2012-04-20 リビジョン 35410) [x86_64-darwin10.8.0]; レール 3.2.6; OS X 10.6.8

問題

  • データベースをリセットした後でも (rake db:reset)、移行によって誤ったテーブル、フィールド、スキーマが生成され、以前の移行仕様では廃止されたテーブル、フィールド、制限、インデックスなどを特徴としています。

バックグラウンド

  • 2 つの OSX 10.6.8 システム間で github 共同プロジェクトを行ったり来たりしました。以前の時点で、意図したテーブル定義を単一の初期移行に統合することにより、移行を最初からやり直しました (以前の多くの移行仕様の実質的な混乱と面倒な処理を排除しました)。

  • 何ヶ月もの間、改訂された移行により、テーブルとスキーマが忠実に生成されました。

  • ポータブル システムからパブリック リポジトリを同期した後、プロジェクトを主要な開発システムにプルした後、さらに移行を行うと、多くのテーブルとフィールドが保持されます。これらは、実際には既存の移行のいずれにも定義されておらず、同じ移行によって生成されたものでもありません。他の協力者の開発環境。言い換えれば、多くの廃止された/非推奨のフィールドとテーブルは、改訂された移行から削除されるずっと前に仕様から何らかの形で存続しています。したがって、db:migrate は、rake db:reset を実行した後でも、この 1 つのシステムで誤ったテーブルとスキーマを生成します。

  • おそらく、以前の処方箋は開発環境のどこかに保持されており、以前の、もはや存在しない定義を削除、修正、または上書きする必要がありますが、それでも望ましくないテーブルやフィールドに蓄積されています。

  • この問題を是正するにあたり、既存の作業を取り消さざるを得ないことは非常に望ましくありません。

質問

プロジェクトで保持した移行仕様に忠実な移行、テーブル、およびスキーマを再生成するための適切かつ効果的な方法は何ですか?

4

2 に答える 2

0

これらを参照してください。

基本的に、実行できます

rake db:schema:load

データベース スキーマを schema.rb ファイルから直接ロードするには、本番データを削除する可能性があるため、本番環境でこれを行う場合は注意してください。

于 2012-09-09T18:09:35.840 に答える
0

修理

次の手順を推測することで、移行仕様と一致するスキーマとテーブルを最終的に生成することができました。

  1. 最初に、自分の schema.rb の do と最後の終了ターミネータの間のすべての命令を手動で削除し、(それが重要かどうかに関係なく) さらにバージョンを 0 に再定義しました。

    ActiveRecord::Schema.define(:version => 0) do  
    end
    
  2. 次に、rake db:drop db:create db:resetを実行しました (最初にテーブルを削除しました。単純に、SQL エンジン プロセスからアーティファクトが残る可能性を排除するためです)。

  3. 最後に、テーブルを再作成する前に、rake db:migrateを実行しました (何らかの理由で、私の環境は、上記の 3 つのコマンドを 1 つのステートメントで実行することを拒否しました [それ以外の場合は、rake db:drop db:create db:schemaを定期的に実行します)。 :load db:fixtures:loadを使用して、テーブルを再構築および再作成します])。

ノート

  • 考えられる要因を診断しようとして、プロジェクトの検索では、私の誤ったスキーマ以外のファイルに非推奨のテーブルまたはフィールドへの参照がまったく見つかりませんでした。したがって、何らかの理由 (おそらく処理エラー?) で、誤った既存のスキーマ参照が後続のプロセスで持続していると推測しました

  • いずれにせよ、ローカルの schema.rb からすべての指示を削除した後、リセットと定期的な移行により、移行仕様に忠実なスキーマを生成することに成功しました。実際、以前の (機能していない) ローカル スキーマから存続しているようです。

  • したがって、おそらくrake db:resetが既存の移行仕様に従ってプロセスが再構築していない無効なスキーマからテーブルとスキーマの両方を生成しているように見える場合、これらの結果 (私は繰り返し再現しています) は db の論理的な欠陥を示しています:リセット - それ自体が以前のスキーマを消去する必要があるため、db:reset は以前のスキーマの仕様を保持したり、誤って依存したりすることはありません。

  • マイグレーションを書く際に自分自身の不注意なエラーを持ち込む可能性のある人々の安全のために、正当なスキーマを再構築する前に、db:reset でまず既存の (機能していない) スキーマをタイムスタンプ付きのバックアップにコピーすることをお勧めします。以前のスキーマの記録への依存が必要になる可能性があります。

于 2012-09-10T04:06:40.370 に答える