2012-11-27 21 views
1

我在使用Sequel的Sinatra應用程序中工作。Ruby Sequel模塊中的事務:如何獲取DB對象?

我想做一個事務,根據manual我必須使用DB對象,我怎樣才能從我的代碼的任何部分得到這個對象?

+0

看看http://sequel.rubyforge.org/rdoc/classes/Sequel.html頂部它只是定義了一個名爲'DB'不變。 – 2012-11-27 21:24:14

回答

2

您可以在您的基本app.rb(或等價物)中定義它,或者在需要時配置DB對象的地方包含一個單獨的文件。

例如,在我屈應用程序之一,我有包括

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

require_relative 'models/init' 

在我的模型/ init.rb我配置DB

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 

... 

這是一種方式的app.rb 。希望能幫助到你。

+0

非常感謝,但是,這會迫使我在每次發出請求時都創建一個連接。他們沒有一些方法來檢索模型正在使用的當前連接嗎? – Lucia

+0

續集管理它自己的連接池,因此不必擔心事情的這一面。 – jboursiquot

+0

另外,如果您擔心事情不止一次配置,只需使用Sinatra的配置助手即可。請參閱http://www.sinatrarb.com/intro#Configuration – jboursiquot

1

你提到你想引用你的代碼的任何部分;但是我發現封裝在模型中的是我傾向於包裝交易的地方;並從那裏相對容易:

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