2013-03-15 49 views
4

當我運行「rails console --sandbox」我無法在我的數據庫中看到插入。當我將選項關閉時,我可以很好地看到我的開發數據庫中的數據。控制檯上的所有東西看起來都是一樣的。我使用Hartl的rails教程中設置的postgreSQL。我看過每個數據庫,開發,測試,Postgres。但無法找到我使用控制檯創建的數據。由於我使用bundel,我試着用,並進行「捆綁高管」什麼數據庫使用rails 3控制檯--sandbox?

這裏是我的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: 

我想這並不重要,但我只是很好奇,什麼是下發生封面在這裏。

謝謝, 馬克

+0

不是重複的但是=> http://stackoverflow.com/questions/3340680/rails-script-console-vs-script-console-sandbox – Zippie 2013-03-15 14:35:04

回答

6

由於控制檯在沙箱模式下充當一個大事務,因此只能通過控制檯看到您插入的內容。

如果通過除控制檯之外的其他方法連接到數據庫,那麼它將使用不同的連接,並且控制檯正在做的事情將從該連接中隱藏,因爲它們尚未提交。

當連接使用事務與數據庫對話時,其他數據庫連接在提交之前無法看到它所做的任何更改。與事務(在本例中爲沙箱控制檯)的連接是唯一可以看到在回滾之前對數據庫所做更改的連接。

+0

謝謝!這很有道理。 – Mark 2013-03-16 05:36:32

+0

很好的解釋 – Gerep 2013-03-16 13:24:49

+0

它在這種沙盒模式下運行回調(例如發送電子郵件)嗎? – 2017-02-15 11:27:50

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)。數據被保存並在此之後,「發佈」。它僅用於測試目的,以檢查模型,驗證等之間的關係是否正確。

+0

謝謝你的迴應。我看到了這一點,但根據輸出結果,在退出回滾之前,似乎會對數據庫執行實際插入操作。在這種模式下,它只是「僞造」插入和回滾,從不真正寫入數據庫?實際上,教程實際上建議查看DB中的記錄以查看命令的結果。一個區別是練習假設SQLite是DB,我已經切換到Postgres。 – Mark 2013-03-15 15:15:20

+0

**更多信息**後續問題:再次感謝您。這實際上是非常好的知道。但是,我認爲我最初並沒有很好地解釋我的案例。我正在查找插入的數據_before_退出控制檯(在回滾之前),並期望看到數據庫中的數據但不是。 – Mark 2013-03-16 00:47:16

相關問題