# ANN: Sequel 0.3 Released

**URL:** <https://www.ruby-forum.com/t/ann-sequel-0-3-released/117784>\
**Category:** Ruby\
**Created:** [October 20, 2007, 5:55am UTC](https://www.ruby-forum.com/t/ann-sequel-0-3-released/117784 "2007-10-20T05:55:24Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![ciconia](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/71c47a/32.png) [@ciconia](https://www.ruby-forum.com/u/ciconia)\
**Post date:** [October 20, 2007, 5:55am UTC](https://www.ruby-forum.com/t/ann-sequel-0-3-released/117784/1 "2007-10-20T05:55:24Z")

</div>

Sequel version 0.3 has just been released. This release includes  
support for retrieving tuples as arrays instead of hashes, a more  
mature model implementation with support for composite primary keys  
and caching, and a new way for quickly retrieving records, as well as  
many other minor improvements and bug fixes.

Sequel is a lightweight ORM library for Ruby. Sequel provides thread  
safety, connection pooling and a simple and expressive API for  
constructing database queries and table schemas.

Following is a discussion of the major changes:

=== Retrieving tuples as arrays

By default Sequel represents record tuples using Ruby hashes. Some  
people, however, have expressed a desire to retrieve records as  
arrays, in order to have a predictable column order. Sequel version  
0.3 can provide array tuples, and also extends them with key access  
(in a similar fashion to Ara Howard’s arrayfields). To use array  
tuples you should add the following line to your code:

Sequel.use\_array\_tuples

Working with the returned array tuples is basically the same as  
working with hash tuples:

DB[:items].first.class #=\> Array

# key access lets you treat arrays as if they were hashes

DB[:items].each {|r| p r[:name]}  
DB[:items].first.each\_pair {|k, v| p [k, v]}

=== Sequel models: composite primary keys, caching

The model implementation has been largely refactored, documented and  
spec’d out and is now much more mature. Sequel models now support  
composite primary keys, which are useful especially for auxiliary  
tables:

class Attribute \< Sequel::Model(:attributes)  
set\_primary\_key [:node\_id, :kind]  
end

class Node \< Sequel::Model(:nodes)  
def attribute(kind)  
Attribute[pkey, kind]  
end  
end

Also new in this release is support for caching using memcached:

require ‘memcache’  
CACHE = MemCache.new ‘localhost:11211’, :namespace =\> ‘dbstuff’

class Attribute \< Sequel::Model(:attributes)  
set\_primary\_key [:node\_id, :kind]  
set\_cache CACHE, :ttl =\> 3600  
end

Attribute[1, 2] # database hit  
Attribute[1, 2] # cache hit

=== New API for retrieving records with plain SQL

While Sequel is great for expressing queries in Ruby, sometimes you  
just want to retrieve records with plain SQL. The new Database#fetch  
method lets you do that:

DB.fetch(‘select \* from items’) {|r| p r}

The #fetch method will return an enumerator if a block is not given,  
letting you do stuff like:

names = DB.fetch(‘select \* from items’).map {|r| r[:name]}  
records = DB.fetch(‘select \* from items’).to\_a

You can also create parameterized queries and enjoy protection from  
SQL injection:

DB.fetch(‘select \* from items where name like ?’, client\_name).to\_a

The Database#[] method has also been modified to act as shortcut to  
#fetch if a string is given:

DB[‘select \* from items’].each {|r| p r}

=== Other improvements and bug fixes

- Added Database#logger= method for setting the database logger  
object.

- Implemented Database#disconnect method for all adapters.

- Changed Database#\<\< to strip comments and whitespace only when an  
array is given.

- Added support for old and new decimal types in MySQL adapter, and  
updated MYSQL\_TYPES with MySQL 5.0 constants (#72).

- Fixed bug in postgres adapter where a LiteralString would be  
literalized as a regular String.

- Fixed SQLite insert with subquery (#68).

- Rewrote SQLite::Database#transaction to use sqlite3-ruby library  
implementation of transactions.

- Model hooks can now be prepended or appended in order to change  
order of execution.

- Enhanced Model.find method to accept block filters.

- Added stock transforms to Dataset#transform. Refactored  
Model.serialize.

- Enhanced Dataset#first to accept a filter block. Model#find can also  
now accept a filter block.

- Changed Dataset#join methods to correctly literalize values in join  
conditions (#70).

- Fixed #filter with ranges to correctly literalize field names (#69).

- Added Dataset#to\_csv method.

- Extended Dataset#from to auto alias sub-queries and accept hash for  
aliasing tables.

- Changed Schema::Generator#primary\_key to accept calls with the type  
argument omitted.

=== More info

Sequel project page:  
[http://code.google.com/p/ruby-sequel](http://code.google.com/p/ruby-sequel)

Sequel documentation:  
[http://sequel.rubyforge.org](http://sequel.rubyforge.org)

Join the Sequel-talk group:  
[http://groups.google.com/group/sequel-talk](http://groups.google.com/group/sequel-talk)

Install the gem:  
sudo gem install sequel

Or check out the source and install manually:  
svn co [http://ruby-sequel.googlecode.com/svn/trunk](http://ruby-sequel.googlecode.com/svn/trunk) sequel  
cd sequel  
rake install
