Ruby Sequel模块中的事务:如何获取DB对象?

时间:2012-11-27 21:21:40

标签: ruby sinatra sequel

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

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

2 个答案:

答案 0 :(得分:2)

您可以在基础app.rb(或等效文件)中定义它,也可以包含一个单独的文件,您可以根据需要配置数据库对象。

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

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

require_relative 'models/init'

在我的models / 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

...

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

答案 1 :(得分:1)

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

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