2017-04-18 35 views
0

我使用Sequel::Model.DB與我的數據庫進行交互,但出於某種原因,數據庫結構已更改,例如,通過數據庫控制檯。如何刷新數據庫連接與續集

這種方法:

Sequel::Model.db.schema('table_name') 

仍返回舊的數據庫,從我猜第一個連接緩存。

如何重置該緩存或理想情況下確保每個請求上的實際數據庫連接?

我試圖用一個新的連接每次:

def db 
    @db ||= Sequel.connect(Sequel::Model.db.opts) 
end 

但是,可以預見,我得到這個錯誤,最終:

Sequel::DatabaseConnectionError - PG::ConnectionBad: FATAL: sorry, too many clients already 
+0

沒有你的代碼的例子,很難做比拋出廣泛的建議更多的事情。 (請閱讀「[mcve]」和鏈接頁面。) –

+0

我已經得到了答案。接受了它(傑勒米正確地回答了我問的)。我有什麼要閱讀更多?非常感謝你的焦慮。 – okliv

回答

3

你不應該改變數據庫的結構一個不兼容的方式,而續集運行。解決這個問題的最簡單方法就是在更改數據庫模式後重新啓動進程,Sequel將選擇新的數據庫結構。

如果您確實想在不重新啓動過程的情況下嘗試這樣做,則可以刪除緩存的模式(@db.instance_variable_get(:@schemas).clear),然後重置所有模型類的數據集(每個Sequel :: Model使用ModelClass.dataset = ModelClass.dataset)。但是,這並不一定會導致同樣的情況,因爲如果您刪除列,那麼舊的列名仍然會爲其定義方法。

+0

感謝黑客,傑里米。我意識到它看起來像一個設計不好的解決方案,但在我的情況下,真的沒有辦法在應用程序運行時凍結數據庫結構。所以我需要不時地實現連接。也許重新啓動這個過程 - 也是一個解決方案,但是我錯了,它比模式清除更慢/更重要嗎? (實際上,我現在沒有考慮過這種可能性,例如,通過應用程序控制器以編程方式執行此操作) – okliv

+1

@okliv爲什麼沒有辦法「凍結」數據庫結構?是否允許用戶更改數據庫的實時結構?這似乎可能是一個設計缺陷,除非你可以徹底解釋一個用例。 – engineersmnky

+0

@engineersmnky,因爲這是管理數據庫結構的「管理員」應用程序@) – okliv