2017-04-18 53 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