3

SQL スクリプトを実行して新しい Postgres スキーマを作成する移行があります。Postgres で新しいデータベースを作成すると、デフォルトで「パブリック」と呼ばれるスキーマが作成されます。これは、使用するメイン スキーマです。新しいデータベース スキーマを作成するための移行は正常に機能しているように見えますが、移行の実行後に問題が発生し、Rails が依存する「schema_info」テーブルを更新しようとすると、存在しないかのように表示されます。テーブルが実際にあるデフォルトの「パブリック」スキーマではなく、新しいデータベーススキーマでそれを探します。

このテーブルの「パブリック」スキーマを調べるようにレールに指示する方法を知っている人はいますか?

実行される SQL の例: ~

CREATE SCHEMA new_schema;
COMMENT ON SCHEMA new_schema IS 'this is the new Postgres database schema to sit along side the "public" schema';
-- various tables, triggers and functions created in new_schema

スローされるエラー: ~

RuntimeError: ERROR C42P01  Mrelation "schema_info" does not exist
L221    RRangeVarGetRelid: UPDATE schema_info SET version = ??

ご協力いただきありがとうございます

クリス・ナイト

4

3 に答える 3

5

それは、移行がどのように見えるか、database.yml がどのように見えるか、そして正確に何を試みようとしているのかによって異なります。とにかく、データベースの例と移行を投稿する必要がある場合は、名前を変更する必要があります。たとえば、移行によってアダプタの search_path が変更されますか?

しかし、一般的に、Rails と Postgresql スキーマはうまく連携しないことを知っておいてください (まだ?)。

問題のある場所がいくつかあります。開発用とテスト用の 2 つのデフォルト以外のスキーマを持つ 1 つの pg データベースのみを使用するアプリを試してビルドし、それについて教えてください。(以下から、あなたがやけどをすることはすでにわかります)

前回遊んでから修正されたのかもしれませんが、http://rails.lighthouseapp.com/projects/8994/tickets/390-postgres-adapter-quotes-table-name-breaks-when-non- default-schema-is-usedまたはこのhttp://rails.lighthouseapp.com/projects/8994/tickets/918-postgresql-tables-not-generating-correct-schema-listまたは postgresql_adapter.rb のこれ

  # Drops a PostgreSQL database
  #
  # Example:
  #   drop_database 'matt_development'
  def drop_database(name) #:nodoc:
    execute "DROP DATABASE IF EXISTS #{name}"
  end

(はい、開発とテストの両方に異なるスキーマを持つ同じデータベースを使用する場合、これは間違っています。これにより、単体テストを実行するたびに両方のデータベースが削除されます!)

私は実際にパッチを書き始めました。最初のものは、いくつかの条件で search_path が重複したインデックスで終わることを気にしないアダプターのインデックス メソッド用でした。その後、残りの部分で傷つき始め、スキーマを使用するという考えを放棄することになりました:私のアプリは完成しましたが、スキーマを使用して発生した問題を修正するために必要な余分な時間がありませんでした.

于 2008-09-18T10:56:14.747 に答える
0

あなたが求めていることを正確に理解しているかどうかはわかりませんが、rake は Rails スキーマのバージョンを schema_info テーブルに更新することを期待しています。database.yml 設定ファイルを確認してください。これは、rake が更新するテーブルを探す場所です。

新しい Postgres スキーマに移行していて、rake がまだ古いスキーマを指している可能性はありますか? その場合、標準の Rails 移行が必要かどうかはわかりません。代わりに、独自の rake タスクを作成することをお勧めします。

編集: 2 つの異なるデータベースまたは Postgres スキーマを参照している場合、Rails は標準的な移行ではこれをサポートしていません。Rails は 1 つのデータベースを想定しているため、通常、あるデータベースから別のデータベースへの移行はできません。「rake db:migrate」を実行すると、実際には RAILS_ENV 環境変数が調べられ、database.yml 内の正しいエントリが検出されます。rake が「開発」環境と database.yml からのデータベース構成を参照して移行を開始すると、移行の最後にこの環境に更新されることが期待されます。

したがって、Rails 内で同時に 2 つのデータベースを参照することはできないため、おそらく Rails スタックの外部からこれを行う必要があります。プラグインでこれを許可する試みがありますが、それらは主にハッキーであり、適切に動作しません。

于 2008-09-18T10:20:18.423 に答える
0

pg_powerを使用できます。PostgreSQL スキーマを作成するだけでなく、移行のための追加の DSL を提供します。

于 2013-08-14T09:23:48.623 に答える