如何访问 Hanami 连接实例

How to get access to Hanami connection instance

Hanami 使用 Sequel 作为默认 ORM

Sequel

有不同的插件

有时要使用它,您需要访问数据库连接对象

例如对互斥体使用 PostgreSQL 咨询锁定

有这样的宝石:sequel-advisory-locking, sequel-pg_advisory_lock

首先,您应该为 Sequel::Database 个实例加载一个扩展

DB.extension(:advisory_locking)

然后像这样在您的应用中使用它

DB.advisory_lock('my_key') do
  # do stuff with lock
end

但是将此类库与 Hanami 一起使用存在问题

官方指南中没有相关信息

database configuration页面上这样的信息:

Hanami models use ROM as a low-level backend. This means that you can easily use any Sequel plugins in your app. For this you need to define a gateway block in your model configuration, add the extension by calling extension on gateway.connection and pass the extension name in:

# config/environment.rb
Hanami.configure do
  model do
    gateway do |g|
      g.connection.extension(:connection_validator)
    end
  end
end

我尝试的是在此配置中定义常量

Hanami.configure do
  model do
    gateway do |g|
      DB = g.connection

      DB.extension(:connection_validator)
      DB.extension(:advisory_locking)
    end
  end
end

然后在应用程序的某处使用此 DB,例如 DB.advisory_lock('my_key') { do_stuff_with_lock }

但是在块中定义这样的常量看起来不太好

如何在Hanami应用程序中获取连接实例?

Hanami 中有配置对象 -- Hanami::Model.configuration

实际上是the getter for @configuration实例变量

它是 Hanami::Model::Configuration 的实例,并且有 instance variables@url@entities@logger 等。所以可以调用 getters 来获取它们

它还有connection方法。 This method returns gateway.connection

而这个gateway.connection正是所需要的。这正是连接数据库的实例,你可以在上面调用方法

例如

Hanami::Model.configuration.connection.advisory_lock('my_lock') do
  # do stuff with lock
end

我想指出所有这些方法都由注释 # @api private 指出。这意味着它们的实现可能会在未来的版本中发生变化。