如何使用 Sequel 刷新数据库连接
How to refresh DB connection with Sequel
我使用 Sequel::Model.DB
与我的数据库进行交互,但由于某种原因,例如通过数据库控制台更改了数据库结构。
这个方法:
Sequel::Model.db.schema('table_name')
仍然是 returns 旧数据库,我猜是从第一个连接缓存的。
如何重置该缓存,或者理想情况下,确保每个请求都有实际的数据库连接?
我每次都尝试使用新连接:
def db
@db ||= Sequel.connect(Sequel::Model.db.opts)
end
但是,不出所料,我最终遇到了这个错误:
Sequel::DatabaseConnectionError - PG::ConnectionBad: FATAL: sorry, too many clients already
当 Sequel 是 运行 时,您不应该以不兼容的方式更改数据库的结构。解决此问题的最简单方法是在更改数据库模式后重新启动进程,Sequel 将采用新的数据库结构。
如果您真的想在不重新启动进程的情况下尝试执行此操作,您可以删除缓存的模式 (@db.instance_variable_get(:@schemas).clear
),并重置所有模型 类 的数据集 (ModelClass.dataset = ModelClass.dataset
每个 Sequel::Model)。但是,这不一定会产生相同的结果,因为如果您删除一个列,旧列名称仍将具有为其定义的方法。
我使用 Sequel::Model.DB
与我的数据库进行交互,但由于某种原因,例如通过数据库控制台更改了数据库结构。
这个方法:
Sequel::Model.db.schema('table_name')
仍然是 returns 旧数据库,我猜是从第一个连接缓存的。
如何重置该缓存,或者理想情况下,确保每个请求都有实际的数据库连接?
我每次都尝试使用新连接:
def db
@db ||= Sequel.connect(Sequel::Model.db.opts)
end
但是,不出所料,我最终遇到了这个错误:
Sequel::DatabaseConnectionError - PG::ConnectionBad: FATAL: sorry, too many clients already
当 Sequel 是 运行 时,您不应该以不兼容的方式更改数据库的结构。解决此问题的最简单方法是在更改数据库模式后重新启动进程,Sequel 将采用新的数据库结构。
如果您真的想在不重新启动进程的情况下尝试执行此操作,您可以删除缓存的模式 (@db.instance_variable_get(:@schemas).clear
),并重置所有模型 类 的数据集 (ModelClass.dataset = ModelClass.dataset
每个 Sequel::Model)。但是,这不一定会产生相同的结果,因为如果您删除一个列,旧列名称仍将具有为其定义的方法。