我在使用Sequel的Sinatra應用程序中工作。Ruby Sequel模塊中的事務:如何獲取DB對象?
我想做一個事務,根據manual我必須使用DB對象,我怎樣才能從我的代碼的任何部分得到這個對象?
我在使用Sequel的Sinatra應用程序中工作。Ruby Sequel模塊中的事務:如何獲取DB對象?
我想做一個事務,根據manual我必須使用DB對象,我怎樣才能從我的代碼的任何部分得到這個對象?
您可以在您的基本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 。希望能幫助到你。
非常感謝,但是,這會迫使我在每次發出請求時都創建一個連接。他們沒有一些方法來檢索模型正在使用的當前連接嗎? – Lucia
續集管理它自己的連接池,因此不必擔心事情的這一面。 – jboursiquot
另外,如果您擔心事情不止一次配置,只需使用Sinatra的配置助手即可。請參閱http://www.sinatrarb.com/intro#Configuration – jboursiquot
你提到你想引用你的代碼的任何部分;但是我發現封裝在模型中的是我傾向於包裝交易的地方;並從那裏相對容易:
class X < Sequel::Model
def self.y
self.db.transaction {
...
end
end
def z
db.transaction {
...
}
end
end
看看http://sequel.rubyforge.org/rdoc/classes/Sequel.html頂部它只是定義了一個名爲'DB'不變。 – 2012-11-27 21:24:14