sinatra,一个轻量级的ruby web框架。如果要写一个不怎么复杂的web小应用,使用这个就在适合不过了。
最近蚊子就自己尝试着写一个小应用,结果在使用mysql这块犯了愁,正常情况下,ruby程序调用mysql还是很容易的,只需要这样做就行了
require 'mysql'
conn = Mysql::new("host", "user", "passwd", "db")
res = conn.qurey("select * from table1")
res.each do |row|
col1 = row[0]
col2 = row[1]
end
但是呢,这样有一个不好的问题,就是,如果我要把数据库的相关操作放到module目录下,变成一个模块来调用,那sinatra自己的settings用法就没法实现.使用settings.config就会报错。不过现在好了,使用connection_pool模块可以解决这个问题,代码如下
require 'rubygems'
require 'bundler/setup'
require 'yaml'
require 'connection_pool'
require 'mysql'
require './app'
class DB
@@db_server = CONFIG[ENV["RACK_ENV"]]['dbconfig']['db_server']
@@db_port = CONFIG[ENV["RACK_ENV"]]['dbconfig']['db_port']
@@db_user = CONFIG[ENV["RACK_ENV"]]['dbconfig']['db_user']
@@db_pass = CONFIG[ENV["RACK_ENV"]]['dbconfig']['db_pass']
@@db_name = CONFIG[ENV["RACK_ENV"]]['dbconfig']['db_name']
@pool = ConnectionPool.new(size: 3, timeout: 5) do
conn = Mysql.new(@@db_server, @@db_user, @@db_pass, @@db_name, @@db_port)
conn.query("SET NAMES UTF8")
conn
end
# 下面的方法从 connection_pool 暴露出来的
class << self
# 使用闭包的形式调用
def with(&block)
@pool.with &block
end
# 直接调用
def method_missing(name, *args, &block)
@pool.with do |connection|
connection.send(name, *args, &block)
end
end
end
end
sessioned = Rack::Session::Pool.new(App.new)
run sessioned
然后在sinatra关联的代码中可以这样使用
DB.query("SELECT now()").fetch_row DB.with { |conn| … }
对于同样使用sinatra开发的朋友,不妨也试试。
© 2013 – 2016, 深夜的蚊子. 版权所有. 如转载,请注明:转载自 蚊子空间[http://www.wenzizone.cn]