【问题标题】:What DB does rails 3 console --sandbox use?rails 3 console --sandbox 使用什么数据库?
【发布时间】:2014-07-23 08:27:40
【问题描述】:

当我运行“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:

我想这并不重要,但我只是很好奇这里的幕后发生了什么。

谢谢, 标记

【问题讨论】:

标签: ruby-on-rails console ruby-on-rails-3.2


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢!这很有道理。
  • 在这种沙盒模式下是否运行回调(例如发送电子邮件)?
【解决方案2】:

使用--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)。数据被保存,然后立即“释放”。它用于测试目的,只是检查您的模型、验证等之间的关系是否正常。

【讨论】:

  • 感谢您的回复。我看到了,但根据输出,它似乎在退出时回滚之前对数据库进行了实际插入。在这种模式下,它只是“伪造”插入和回滚,而从未真正写入数据库吗?实际上,教程实际上建议查看 th DB 中的记录以查看命令的结果。一个区别是,练习假设 SQLite 是数据库,而我已切换到 Postgres。
  • 更多信息 后续问题:再次感谢。这实际上很好知道。但是,我认为我最初没有很好地解释我的情况。我正在寻找插入的数据之前退出控制台(回滚之前)并希望看到数据库中的数据但不是。
猜你喜欢
  • 1970-01-01
  • 2012-06-13
  • 2011-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-19
  • 2014-12-28
  • 1970-01-01
相关资源
最近更新 更多