【发布时间】:2014-09-29 02:04:56
【问题描述】:
我正在使用 Sequel 在 Sinatra 应用程序中工作。
我想做一个事务,根据manual我必须使用DB对象,如何从我的代码的任何部分获取这个对象?
【问题讨论】:
-
看看sequel.rubyforge.org/rdoc/classes/Sequel.html 的顶部,它只定义了一个名为
DB的常量。
我正在使用 Sequel 在 Sinatra 应用程序中工作。
我想做一个事务,根据manual我必须使用DB对象,如何从我的代码的任何部分获取这个对象?
【问题讨论】:
DB 的常量。
您可以在您的基础 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
...
这是一种方式。希望对您有所帮助。
【讨论】:
您提到要从代码的任何部分引用;但是我发现封装在模型中是我倾向于包装事务的地方;从那里开始相对容易:
class X < Sequel::Model
def self.y
self.db.transaction {
...
end
end
def z
db.transaction {
...
}
end
end
【讨论】: