2

sqlite3 データベースでローカルに正常に動作し、問題なくレコードを保存および取得できる Ruby on Rails アプリがあります。

postgresql データベースを使用してhttp://moviedata.herokuapp.com/のHeroku にデプロイすると、ログにレコードが記録されているように見えても、レコードが保存されません。データベースから読み取ったレコードは正常で、データは期待どおりに表示されます。

レコードを追加するための末尾のログは次のとおりです。

2012-08-21T19:51:31+00:00 app[web.1]: 
2012-08-21T19:51:31+00:00 app[web.1]: 
2012-08-21T19:51:31+00:00 app[web.1]: Started POST "/" for 50.53.6.156 at 2012-08-21 19:51:31 +0000
2012-08-21T19:51:31+00:00 app[web.1]:   Parameters: {"utf8"=>"✓", "authenticity_token"=>"+BYQLzhrfDkUVW8UaHikHpmtGHxpeQ/yF4VByHh9m1I=", "movie"=>{"title"=>"The Running Man", "description"=>"A documentary about a public execution game show.", "year"=>"1987", "genre"=>"science fiction"}, "commit"=>"Create Movie"}
2012-08-21T19:51:31+00:00 app[web.1]: Processing by MoviesController#index as HTML
2012-08-21T19:51:31+00:00 app[web.1]:   Rendered movies/index.html.erb within layouts/application (5.1ms)
2012-08-21T19:51:31+00:00 app[web.1]: Completed 200 OK in 9ms (Views: 6.7ms | ActiveRecord: 0.9ms)
2012-08-21T19:51:31+00:00 heroku[router]: POST moviedata.herokuapp.com/ dyno=web.1 queue=0 wait=0ms service=17ms status=200 bytes=3479

「heroku pg」コマンドは、レコードが追加された後、postgres データベースで同じ行数 (11) を示します。

これは、Rails と Heroku プラットフォームを学習するために作成したシンプルなアプリです。これを再現するには、http://moviedata.herokuapp.com/にアクセスして [新しいムービー] をクリックし、フォームにジャンク データを入力して [ムービーを作成] をクリックします。レコードは保存され、フロント ページのリストに表示されるはずですが、そうではありません。

postgres データベースに書き込めるようにするために、有効にする、設定する、または有効にする必要があるものはありますか? 読み取りはできるが書き込みはできないというのは、私には非常に奇妙に思えます。ログよりもトラブルシューティングに適した方法はありますか?

ローカルでは、Ruby 1.9.3、Rails、3.2.8、PostgreSQL 9.1.5、SQLite 3.7.9、Heroku Toolbelt 2.30.3 を使用しています。

編集/更新: psql を使用するようにローカル バージョンを切り替えました。また、レコードが保存されないという同じ問題が発生します。ユーザーが log_statement='all' に設定されている場合 /var/log/postgresql/posgresql-9.1.main.log にログインすると、多くの選択が示されますが、レコードの追加が試行されると、ログにはデータベースがヒットしないことが示されます。

Foreman は、投稿されているデータを次のように表示します。

22:38:03 web.1     | Started POST "/" for 127.0.0.1 at 2012-08-21 22:38:02 -0700
22:38:03 web.1     | Processing by MoviesController#index as HTML
22:38:03 web.1     |   Parameters: {"utf8"=>"✓", "authenticity_token"=>"0AyxRbwl/Kgi05uI1KX8uxVUJjx9ylAA1ltdWgmunm4=", "movie"=>{"title"=>"Army of Darkness", "description"=>"A man fights the living dead using a boomstick.", "year"=>"1997", "genre"=>"horror"}, "commit"=>"Create Movie"}
22:38:03 web.1     |   Movie Load (0.8ms)  SELECT "movies".* FROM "movies" ORDER BY title
22:38:03 web.1     |   Rendered movies/index.html.erb within layouts/application (14.9ms)

失敗したコミットは素晴らしい説明のように聞こえます。ドライバーがコミットするように設定されているかどうかを確認する方法や、コミットがいつどのように失敗したかを確認する方法はまだわかりません。

これは非常に単純なアプリケーションであり、負荷分散や複雑な構成はなく、ほとんどのコードは 'generate scaffold' コマンドによって生成されましたが、データベースがヒットする前に何らかの制約に違反している可能性は十分にあります。Foreman (または Rails) のログレベルを 11 まで上げる方法はあるのでしょうか? また、代わりに thin を使用してみましたが、log/ フォルダー内のログ ファイルを精査しましたが、上記のログ以外に何も見つかりませんでした。

4

1 に答える 1

2

これは、作業後にトランザクションを実行しないトランザクションの問題によく似ているCOMMITため、変更が失われます。SQLite ドライバーが既定でCOMMIT、明示的またはロールバックなしで閉じられたトランザクションを tingCOMMITし、Pg ドライバーが既定で に設定されてROLLBACKいる場合、説明されている動作が得られます。SQLite がデフォルトで各ステートメントを自動コミットするようにデフォルト設定されていて、Pg ドライバー ドライバーがデフォルトでトランザクションを開くように設定されている場合、同じことが起こります。

これは、ライブに移行するときに展開するのと同じローカル データベースをテストに使用する多くの正当な理由の 1 つです。

通常の Pg インスタンスを使用している場合は、 を有効log_statement = 'all'にしてpostgresql.conf、Pg をリロードし、ログを監視するように伝えます。Heroku ではできませんが、Pg ログにはheroku logs --ps postgres. を実行してALTER USER my_heroku_user SET log_statement = 'all';再テストし、ログを調べてください。

または、Pg をローカルにインストールします。

考えられる可能性が低い他の可能性:

  • 読み取りに長時間の SERIALIZABLE トランザクションを使用しているため、スナップショットが更新されません。かなりありそうもない。
  • データベース オブジェクトに対するアクセス許可が原因INSERTで、s、UPDATEs などが失敗し、アプリは結果のエラーを無視しています。繰り返しますが、ありそうもありません。
  • DO INSTEAD期待どおりに動作しないルールや、BEFOREを返すトリガーがあるためNULL、操作が何も行われずに無操作になります。SQLite でテストしている場合はありそうにありません。
  • 読み取り元とは異なる DB に書き込みを行っています。ホット スタンバイなどのクラスターから読み取ろうとしているセットアップでは不可能ではありません。
于 2012-08-22T01:12:38.310 に答える