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

由于控制台在沙盒模式下充当一项大事务,因此您只能通过控制台查看您所做的插入。

如果您通过控制台以外的任何其他方法连接到您的数据库,那么它将使用不同的连接,并且控制台正在执行的操作将从该连接中隐藏,因为它们尚未提交。

当连接使用事务与数据库通信时,其他数据库连接在提交之前无法看到它所做的任何更改。与事务的连接(在本例中为沙盒控制台)是唯一可以看到它在回滚之前对数据库所做的更改的连接。

于 2013-03-16T00:56:04.407 回答
5

--sandbox使用该选项,您将永远不会看到数据库中保存的任何内容。当您退出控制台时,使用此模式所做的任何更改都将恢复。

当您使用此选项启动控制台时,您可以阅读:您所做的任何修改都将在退出时回滚

更多信息

如果你再试一次,你会SAVEPOINT active_record_1在插入之前看到,在插入之后你会看到RELEASE SAVEPOINT active_record_1

阅读这两个链接,您将更好地了解正在发生的事情。 http://www.postgresql.org/docs/8.1/static/sql-savepoint.html http://www.postgresql.org/docs/9.1/static/sql-release-savepoint.html

更多信息 2 =)

正如您在这两个链接上看到的那样,PostgreSQL 创建一个SAVEPOINT,保存对象,然后RELEASE SAVEPOINT. 它不会永久保存该数据,这不是--sandbox使用方式(IMO)。数据被保存,然后立即“释放”。它用于测试目的,只是检查您的模型、验证等之间的关系是否正常。

于 2013-03-15T14:31:44.463 回答