2

Rails アプリを Heroku にデプロイできるように、開発 (およびテスト/本番) データベースを PostgreSQL に切り替えようとしています。

彼らの指示と Railscast に従い、StackOverflow と Google を調べて、database.yml ファイルを書き換えて他のすべてを行う正しい方法を探しましたが、多くの問題に直面していたので、誰かが私を理解するのを手伝ってくれることを望んでいました他に何をする必要がありますか。私が試したことを以下に説明します。

1 つの大きな問題は、database.yml ファイルをどうするかということです。多くのサイトは同意しないか、単にプール、ユーザー名、またはエンコーディング (または、さらに言えば、実稼働環境全体) のエントリをまったく持っていません。いろいろ調べて組み合わせた結果、こんな感じになりました。これは機能しますか?:

development:
  adapter: postgresql
  encoding: unicode
  database: <appname>_development
  pool: 5
  username: <username>
  password: <password>

test:
  adapter: postgresql
  database: <appname>_test
  username: <username>
  password: <password>
  host: localhost

プールとは?エンコーディングは必要ですか? 多くの例で yml ファイルに production セクションがないのはなぜですか?

Railscastの提案に従って、PostgreSQLを自作でインストールし、データベースを初期化してから、この行を実行しました。

pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start

別の StackOverflow の回答に従って、Postgres が /usr/local/bin/postgres ディレクトリにあることを確認し、この行を .bash_profile ファイルに追加しました。

export PATH="/Applications/Postgres.app/Contents/MacOS/bin:$PATH"

また、Railscast の提案に従って、taps gem をインストールし、次の行を実行しました。

taps server sqlite://db.development.sqlite3 <username> <password>

次に、新しいタブを開いて実行しました:

taps pull postgresql://<username>@localhost/<appname>_development http://localhost//5000

しかし、それを入力すると、次のエラーが表示されます。

Failed to connect to database:
  Sequel::AdapterNotFound -> LoadError: cannot load such file -- sequel/adapters/postgresql

確かに私はたくさん間違っています。(たとえば、代わりに sqlite3 データベースからプルする必要がありますか?その URL を知るにはどうすればよいですか?)。しかし、トラブルシューティングを開始する方法がわからないので、助けを求めることにしました。

ありがとう!

4

5 に答える 5

8

Heroku、および「database.yml」ファイルの「production」セクション

database.ymlHerokuは、本番用にファイルが何を言っても無視します。productionHeroku は、Bamboo および Cedar スタックに独自の構成を自動的に挿入します。別の言い方をすれば、production空のままにしておきます。Bamboo または Cedar スタックにデプロイする場合は必要ありません。

一方、Amazon Web Services などにデプロイしているが、Heroku のホストされた Postgres ソリューションをバックエンド データベースとして使用している場合 (それ自体は AWS 上で実行されます)、の中にセクション指定します。productiondatabase.yml

「タップ」の宝石

これは、既存のデータベース (あなたにとっては SQLite) から新しいデータベース (PostgreSQL、これからはローカル開発に使用されることを願っています) にデータを移行できるようにする宝石のようです。あまり詳しくは知りませんでしたが、tapsActiveRecord (または別の ORM ソリューション) を使用して、サポートされている任意のデータベースからレコードを読み取り、ActiveRecord を使用してデータを宛先データベースに書き戻すと推測しています。ActiveRecord を一種のデータベース間トランスレータとして使用することで、データを移動するためにデータベース固有のクエリを作成する必要がなくなります。

そうは言っても、ローカル データベースが単なる開発データであり、それを再作成できると仮定すると (そうあるべきです - それは単なる開発データです)、taps完全に使用を控えることができるかもしれません。開発データを SQLite から Postgres に移行しないでください。SQLiteの使用を停止し、すべての移行が実行されているか、そのdb:schema:load上にある空のデータベースで Postgres の使用を開始してください。

気まぐれで簡単に再作成できる優れた開発データの作成は、Populatorを介して可能です(将来のニーズのために - 今はあまり心配しません)。

「データベースへの接続に失敗しました:」エラー

gemをインストールpgましたか? これは、Rails で PostgreSQL サーバーと通信するために必要な gem です。そのエラーの私の解釈は、gem が欠落しているだけであることを示唆しているpgため、「Sequel::AdapterNotFound」

プール

プールは、アプリケーションからデータベースで使用できるようにする同時接続の数です。SQLite では、これを指定して、特定の数の同時読み取りを許可できます。SQLite (ドキュメントで暗示されていることとは反対に) は、同時書き込みをサポートしていません

アプリが複数の Web インスタンスによって提供されている場合はいつでも、プールは本番環境で役立ちます。プールは、データベースへの同時接続の最大数を指定します。通常、Web サーバーは、アクティブなリクエストごと、スレッドごとなど、1 つの接続を使用します。ここでは技術的な詳細をごまかしていますが、要点は、サポートする必要がある同時実行性 (同時要求の数) が多いほど、使用可能な接続が多くなる可能性があるということです。

前に述べたように、これは Heroku では無視されるため、指定しても意味がありません。また、ローカル開発では、おそらく一度に 1 つのリクエストしか作成しないため、これを に1設定することは、おそらく に設定することと同じように見えます5

では、プール内のすべての接続が現在使用されている場合はどうなるでしょうか? 後続の要求は、接続が使用可能になるか、接続がタイムアウトになるまで、いずれか早い方でキューに入れられます。

接続プールの詳細については、こちらを参照してください。

于 2012-09-17T19:42:45.543 に答える
3

TapsはSequelを使用し、Sequelは接続文字列postgres://...の代わりにを使用します。postgresql://...試してみてください:taps pull postgres://<username>@localhost/<appname>_development http://localhost//5000

于 2012-09-18T16:24:22.777 に答える
1

これは一般的にpostgresに使用するものです:

production:
  adapter: postgresql
  encoding: utf8
  database: app_name
  pool: 5
  host: localhost
  username: username
  password: password

また、yaml は扱いにくい場合があるため、書式設定ではタブを避け、スペースのみを使用するようにしてください。

于 2012-09-18T12:12:18.290 に答える
1

RoR アプリの SQLite から Postgres への移行に 10 分

これは、sqlite に開発データベースがあり、構造とデータを postgres に移動したいと想定しています。

最初に、自分のユーザー名を持つユーザーを使用して、Postgres をローカルにインストールして構成する必要があります。postgres インストール ドキュメントは次のとおりです。


必要なソフトウェア: postgresql、pgloader


手順

  1. pgloader / postgres をインストールし、システムで postgresql が実行されていることを確認します
  2. sqlite のバックアップ - development.sql を development_old.sql にコピーします。
  3. gem 'pg'Gemfile のメインセクションに追加
  4. バンドル インストール
  5. config/database.yml を更新します (以下のサンプルを参照)
  6. レーキ データベース:セットアップ
  7. cd [アプリケーションルート]
  8. postgres db に sqlite からのデータをロードする

pgloader ./db/development.sqlite3 postgresql:///[name of postgres dev db]

  1. gem 'sqlite3'gemfile から削除する
  2. バンドル インストール
  3. サーバーを起動 -rails server
  4. localhost:3000 でアプリにアクセスしてテストします

問題や特殊なケースに遭遇した場合に役立つリソースがいくつかあります。

資力:

database_sample.yml

default: &default
  adapter: postgresql
  encoding: unicode
  host: localhost
  port: 5432
  # For details on connection pooling, see Rails configuration guide
  # http://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000

development:
  <<: *default
  database: [name of app]_dev

test:
  <<: *default
  database: [name of app]_test

staging:
  <<: *default
  database: [name of app]

production:
  <<: *default
  database: [name of app]
于 2018-06-27T17:54:47.683 に答える
1

私は最近これを行い、私のdatabase.ymlは以下のみを使用します:

development:
  adapter: postgresql
  username: my_user
  database: my_project_development

Heroku の Postgres DB にデータがある場合は、heroku db:pullPostgres 開発データベースにデータを入力することができます。それ以外の場合は、 Sqlite db:pushデータを (古い database.yml 構成を使用してマシンから) Heroku に送信し、database.yml を更新してから、db:pull.

于 2012-09-17T19:33:18.607 に答える