これは、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トランザクションを使用しているため、スナップショットが更新されることはありません。ありそうもない。
- データベースオブジェクトへのアクセス許可が原因で
INSERT
s、UPDATE
sなどが失敗し、アプリは結果のエラーを無視します。繰り返しますが、ありそうにありません。 -
DO INSTEAD
があります 期待どおりに機能しないルール、またはBEFORE
NULL
を返すトリガー 、したがって、静かに操作を操作なしに変えます。 SQLiteでテストしている場合は、ありそうもないようです。 - 読み取り元とは異なるDBに書き込んでいます。ホットスタンバイのクラスターなどから読み取ろうとしているセットアップでは不可能ではありません。