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(█) @pool.with █ end # 直接调用 def method_missing(name, *args, █) @pool.with do |connection| connection.send(name, *args, █) 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, 深夜的蚊子. 版权所有. 如转载,请注明:转载自 蚊子空间[http://www.wenzizone.cn]