4

私は 2 つのマシンを持っています... 開発マシンと生産マシンです。Rails アプリを本番サーバーに初めて導入したときは、何の問題もありませんでした。rake db:schema:load RAILS_ENV=production を実行して schema.rb をインポートしました。すべてが順調でした。

そこで、開発マシンでさらにいくつかの変更と別の移行を行い、新しいアプリケーションを運用マシンにコピーしました。次に、rake db:migrate RAILS_ENV=production を実行してデータベースを更新しようとしました。次のエラーが表示されます:「データベースには、'schema_migrations' という名前のオブジェクトが既に存在します。」

私は自分自身に考えています、冗談じゃないレーキ... あなたがそれを作成しました! rake で trace を実行しましたが、rake が実行されたのはこれが初めてだと思われるようです。しかし、開発マシンと本番マシンの「schema_migrations」テーブルを分析すると、1 つの移行、つまり移行したい移行に違いがあることがわかります。

また、バージョン番号を明示的に定義しようとしましたが、それも機能しません。

本番サーバーを最新の状態にする方法について何かアイデアはありますか?

アップデート:

データベースを単に「ドロップ」することはできないということから始めましょう。これは、すでに 100,000 を少し超えるレコードがある運用サーバーです。今後、同様の問題が発生した場合はどうなりますか? データベースに問題が発生するたびにテーブルを削除する必要がありますか? 今回はうまくいくかもしれませんが、すべてのデータベースの問題に対する実際的な長期的な解決策とは思えません。私が今抱えている問題は、私だけのものではないと思います。

  1. 「schema_info」テーブルと「schema_migrations」テーブルは同じようです。私のセットアップでは、「schema_migrations」しかありません。前述のとおり、本番サーバーと開発マシンの「schema_migrations」テーブルの違いは 1 つのレコードだけです。つまり、移行したい変更のバージョン番号を含むレコードです。

  2. 私が読んだ本「Simply Rails 2」には、最初に本番サーバーに移動するときは、rake db:migrate を実行する代わりに、rake:db:schema:load を実行するだけでよいと書かれています。

  3. 問題があれば、Rails バージョン 2.1 を使用しています。

4

9 に答える 9

1

アップデートについて:

  1. 本番のschema_migrationsと開発バージョンの違いがわかりません。両方のテーブルにレコードがありますか(「バージョン」の列は1つだけです)、それとも開発DBに1つのレコードがあり、本番環境にはゼロのレコードがありますか?実動テーブルにゼロのレコードがある場合は、次のようにします。

    ActiveRecord::Base.connection.execute("INSERT schema_migrations (version) VALUES(#{my version number that production is supposedly on})")

  2. または、schema_migrationsテーブルを完全に本番環境にドロップしてみることもできます。

    ActiveRecord::Base.connection.execute("DROP TABLE schema_migrations")

    次に、を再実行しrake db:migrate RAILS_ENV=productionます。ただし、バージョン1から移行を実行しますが、これはおそらくあなたが求めているものではありません。

  3. または、本番環境でIRBセッションを開始し、ロードする移行ファイルの「require」または「load」(どちらが重要かどうかはわかりません)を実行してから、を呼び出すこともできますMyMigrationClass.up。その後もschema_migrationsテーブルでバージョン番号を手動で設定する必要があります。これは今後も問題が発生するためですが、クイックフィックスタイプのハックとしては機能します。

于 2008-10-28T00:33:37.590 に答える
1

本番環境で使用されているシステムによっては、以下が機能しない例を見てきました。

rake db:migrate RAILS_ENV=production

しかし、これが機能する場所:

RAILS_ENV=production rake db:migrate

風変わりなことはわかっていますが、違いがあるかどうかを試す価値はあります.

于 2009-04-01T20:53:24.547 に答える
1

「データベースには、'schema_migrations' という名前のオブジェクトが既に存在します。」エラー メッセージが表示される場合、データベースとして MS SQLServer を使用していると思われますか? (これは MS SQL Server のエラー メッセージのようです)

はいの場合、どの ActiveRecord データベース アダプタを使用していますか? (database.yml ファイルは何ですか?MS SQL Server データベースにアクセスするためにインストールした gem は何ですか?)

現在、Rails は運用スキーマで schema_migrations テーブルを見つけられないため、作成しようとしているようですが、この作成はデータベース エラー メッセージで失敗します。おそらくその理由は、schema_migrations テーブル名の大文字/小文字です。MS SQL Server の識別子は大文字と小文字が区別されることを理解している限りです。

于 2008-10-31T09:41:45.703 に答える
1

これは推測です。私は認めます。実稼働環境で db:migrate の代わりに db:schema:load を最初に実行したため、db の構造は取得できましたが、migrate が schema_info テーブルに入力するデータは得られなかったと思います。そのため、本番環境で移行を実行すると、schema_info にデータがないため、migrate はまだ実行されていないと認識します (実行していないため)。

そうは言っても...あなたは「schema_migrations」テーブルを見て、開発から本番まで1つのバージョンの違いがあると言います...私は数ヶ月ですが、そのテーブルについて聞いたことがありません私のレールバージョンの後ろ。おそらく、単一の「バージョン」列を含む「schema_info」テーブルを本番環境で作成し、本番環境であると思われるバージョンの行を追加してみてください。

于 2008-10-24T23:48:14.773 に答える
0

この投稿がしばらく前のものであることは知っていますが、たまたま見つけたのですが、実際には回答がありません。グーグルで出てくるので、ここに行きます。

rake db:schema:dump を実行すると (またはビルド スクリプトによって実行された場合)、移行テーブルの定義が schema.rb に配置されます。スクリプトの最後で、プロセスはテーブルを再度作成しようとしますが、テーブルは明らかに既に存在しています。rake:schema:load を実行する前に、schema.rb から migrations テーブルを削除するだけで、エラー メッセージは表示されません。

その後移行を実行するには、移行テーブルにバージョン番号を設定する必要があります。そのため、schema.rb がどのバージョンに関連しているかを知ること、または古い移行をすべて削除することが重要です (それらは SCM に安全に保存されていますよね?)

于 2009-10-21T14:00:21.927 に答える
0

schema_info は古いバージョンの Rails のものです。schema_migrations はブロックの新しい子供です。schema_info テーブルは使用されなくなるため、削除できるはずです。この名前の変更に関連する問題を検索することをお勧めします。

于 2008-11-11T21:52:03.007 に答える
0

rake db:schema:load は schema.rb からデータベース構造をロードします。このファイルは、データベース構造の現在の表現です。すべてのテーブルとインデックスを作成する必要がある空のスキーマ (データベース) がある場合に使用されます。すべての移行を実行する必要がなくなります。データが入った既存の運用データベースがある場合、それを実行したくありません。他の人が言ったように、それは悪いでしょう!

于 2008-11-11T21:57:03.933 に答える
0

DB を削除し、再度追加して rake rb:migrate を実行します。Brad の言うとおり、スキーマの読み込みを実行したときに、schema_migrations テーブルにレコードがまったく配置されませんでした。

もちろん、本番サーバーで失うことができないデータがある場合、これはより複雑になります。rake バックアップ タスクを取得し (それがコアの一部であるかどうかは不明)、本番データベースで rake db:backup:write を実行し、本番環境で移行を最新の状態に更新した後、rake db を実行します。バックアップ:読み取り。

于 2008-10-25T00:18:53.403 に答える
-1
rake db:migrate RAILS_ENV=production

最初の作成のためだけにタスクを使用しdb:schema:loadます。増分変更を移行する必要があります。

于 2008-10-25T03:31:57.660 に答える