これは、COMMITではないトランザクションの問題によく似ています。 作業後にトランザクションを実行すると、変更が失われます。 SQLiteドライバーのデフォルトがCOMMITの場合 明示的なCOMMITなしで閉じられたトランザクションを処理する またはロールバックすると、PgドライバーのデフォルトはROLLBACKになります 、説明されている動作が表示されます。 SQLiteがデフォルトで各ステートメントを自動コミットし、Pgドライバードライバーがデフォルトでトランザクションを開く場合も同じことが起こります。
これは、本番環境に移行するときにデプロイするのと同じローカルデータベースをテストに使用する多くの理由の1つです。
通常のPgインスタンスを使用している場合は、log_statement = 'all'を有効にするように指示します。 postgresql.conf内 、Pgをリロードし、ログを監視します。 Herokuでそれを行うことはできませんが、heroku logs --ps postgresを使用してPgログにアクセスできます。 。 ALTER USER my_heroku_user SET log_statement = 'all';を実行してみてください 、再テスト、およびログの調査。
または、Pgをローカルにインストールします。
頭に浮かぶ可能性が低いその他の可能性:
- 読み取りに長時間実行されるSERIALIZABLEトランザクションを使用しているため、スナップショットが更新されることはありません。ありそうもない。
- データベースオブジェクトへのアクセス許可が原因で
INSERTs、UPDATEsなどが失敗し、アプリは結果のエラーを無視します。繰り返しますが、ありそうにありません。 -
DO INSTEADがあります 期待どおりに機能しないルール、またはBEFORENULLを返すトリガー 、したがって、静かに操作を操作なしに変えます。 SQLiteでテストしている場合は、ありそうもないようです。 - 読み取り元とは異なるDBに書き込んでいます。ホットスタンバイのクラスターなどから読み取ろうとしているセットアップでは不可能ではありません。