6

「rails console --sandbox」を実行すると、データベースに挿入が表示されません。オプションをオフのままにすると、開発データベースのデータを問題なく表示できます。コンソールからのすべてが同じように機能するようです。Hartl の rails チュートリアルで設定されているように、postgreSQL を使用しています。Development、Test、Postgres の各データベースを調べました。しかし、コンソールを使用して作成したデータが見つかりません。私はbundelを使用しているので、「bundle exec」の有無にかかわらず試しました

ここに私のdatabase.ymlがあります:

development:
  adapter: postgresql
  encoding: unicode
  database: sample_app_development
  pool: 5
  timeout: 5000
  username: user
  password:

test:
  adapter: postgresql
  encoding: unicode
  database: sample_app_test
  pool: 5
  timeout: 5000
  username: user
  password:

これは重要ではないと思いますが、ここで何が起こっているのか非常に興味があります.

ありがとう、マーク

4

2 に答える 2

8

コンソールはサンドボックス モードで 1 つの大きなトランザクションとして機能するため、作成した挿入はコンソールからのみ確認できます。

コンソール以外の方法でデータベースに接続している場合、別の接続が使用され、コンソールが実行していることはまだコミットされていないため、その接続から隠されます。

接続がトランザクションを使用してデータベースと通信する場合、他のデータベース接続は、コミットするまで変更を認識できません。トランザクションとの接続 (この場合、サンドボックス化されたコンソール) は、ロールバック前にデータベースに加えられた変更を確認できる唯一の接続です。

于 2013-03-16T00:56:04.407 に答える
5

--sandboxオプションを使用してデータベースに保存されたものは表示されません。このモードで行った変更は、コンソールを終了すると元に戻ります。

このオプションを使用してコンソールを起動すると、以下を読み取ることができます

より詳しい情報

もう一度試すとSAVEPOINT active_record_1、挿入の前と直後に表示されますRELEASE SAVEPOINT active_record_1

これら 2 つのリンクを読むと、何が起こっているのかがよくわかります。 http://www.postgresql.org/docs/8.1/static/sql-savepoint.html http://www.postgresql.org/docs/9.1/static/sql-release-savepoint.html

詳細情報 2 =)

これら 2 つのリンクでわかるように、PostgreSQL は を作成しSAVEPOINT、オブジェクトを保存してからRELEASE SAVEPOINT. そのデータを永続的に保存するわけではありません。これは--sandbox使用される方法ではありません(IMO)。データは保存され、その直後に「解放」されます。モデル間の関係、検証などに問題がないかどうかを確認するためのテスト目的で使用されます。

于 2013-03-15T14:31:44.463 に答える