Rack::WithSequel
Rack middleware that explicitely acquires a Sequel database connection for entire request. It's reasonable if you want a Rails-like behaviour where database connection is released by the ActiveRecord::ConnectionAdapters::ConnectionManagement
middleware at the end of request.
But please use it with warning that using Rack::WithSequel
you'll get every request locking one connection from the pool even if database is not used during this request (for example, Rails acquires a connection only when it's needed).
Installation
Add this line to your application's Gemfile:
gem 'rack-with_sequel'
And then execute:
$ bundle
Or install it yourself as:
$ gem install rack-with_sequel
Usage
use Rack::WithSequel
By default it will wrap every request in Sequel::Model.db.synchronize do ... end
.
Suppose we have a PostgreSQL connection somewhere:
DB = Sequel.connect("postgres://postgres:postgres@localhost:5432/test")
Then we can pass it to the middleware as an option:
use Rack::WithSequel, db: DB
So DB
will be used instead of Sequel::Model.db
.
Minimal example:
require 'sinatra'
require 'rack/with_sequel'
db = Sequel.connect("postgresql://postgres:postgres@localhost:5432/test")
use Rack::WithSequel, db: db
get '/' do
puts db[:test].all.inspect
end
Handling connection errors
Sometimes it's reasonable to handle connection errors. In this case it's recommended to define a custom middleware:
require 'rack/with_sequel'
class CustomWithSequel < Rack::WithSequel
ERRORS = [Sequel::DatabaseConnectionError, Sequel::PoolTimeout]
def call(env)
super
rescue *ERRORS
[503, {}, ["database connection error"]]
end
end
# ...
use CustomWithSequel
Contributing
- Fork it ( https://github.com/marshall-lee/rack-with_sequel/fork )
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create a new Pull Request