【问题标题】:Transactions in Ruby Sequel module: how to get DB object?Ruby Sequel 模块中的事务:如何获取 DB 对象?
【发布时间】:2014-09-29 02:04:56
【问题描述】:

我正在使用 Sequel 在 Sinatra 应用程序中工作。

我想做一个事务,根据manual我必须使用DB对象,如何从我的代码的任何部分获取这个对象?

【问题讨论】:

标签: ruby sinatra sequel


【解决方案1】:

您可以在您的基础 app.rb(或等效项)中定义它,或者如果您愿意,可以在其中包含一个单独的文件来配置 DB 对象。

例如,在我的一个 Sinatra 应用程序中,我有一个 app.rb,其中包含一个

class App < Sinatra::Application
  #lots of stuff here...
end

require_relative 'models/init'

在我的模型/init.rb 中我配置了数据库

require 'sequel'

conf = YAML.load(File.open(File.expand_path('./config/dbconn.yml')))
env = ENV['RACK_ENV'] || 'development'
DB = Sequel.connect(host:conf['database'][env]['host'],
                    port:conf['database'][env]['port'],
                    database:conf['database'][env]['schema'],
                    username:conf['database'][env]['username'],
                    password:conf['database'][env]['password'],
                    adapter:conf['database'][env]['adapter'],
                    encoding:conf['database'][env]['encoding'])
raise "Unable to connect to #{conf['database'][env]['host']}" unless DB.test_connection

...

这是一种方式。希望对您有所帮助。

【讨论】:

  • 非常感谢,但是,这将迫使我在每次发出请求时都创建一个连接。他们没有一些方法来检索模型正在使用的当前连接吗?
  • Sequel 管理自己的连接池,因此无需担心这方面的问题。
  • 另外,如果您担心配置不止一次,只需使用 Sinatra 的配置助手。见sinatrarb.com/intro#Configuration
  • 我可以粘贴一个我如何配置我的 app.rb 文件的示例,如果这能帮助您理解它的话。告诉我。
【解决方案2】:

您提到要从代码的任何部分引用;但是我发现封装在模型中是我倾向于包装事务的地方;从那里开始相对容易:

class X < Sequel::Model
  def self.y
    self.db.transaction {
    ...
    end
  end
  def z
    db.transaction {
    ...
    }
  end
end  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    相关资源
    最近更新 更多