質問

SQL スクリプトを実行して新しい Postgres スキーマを作成する移行があります。Postgres で新しいデータベースを作成すると、デフォルトで「public」というスキーマが作成されます。これが、私たちが使用する主なスキーマです。新しいデータベース スキーマを作成するための移行は正常に動作しているように見えますが、移行の実行後に問題が発生します。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 = ??

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

クリス・ナイト

役に立ちましたか?

解決

それは、移行がどのようなものであるか、database.yml がどのようなものであるか、そして正確に何を試行しようとしているかによって異なります。とにかく、さらに詳しい情報が必要です。必要に応じて名前を変更し、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-generated-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 が重複したインデックスになることを気にしませんでした。その後、残りの部分に傷つき始め、最終的にスキーマを使用するというアイデアを放棄しました。手に入れたかった 私の アプリは完了しましたが、スキーマを使用して発生した問題を修正するのに必要な余分な時間がありませんでした。

他のヒント

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

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

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top