# ANN: Sequel 3.12.0 Released

**URL:** <https://www.ruby-forum.com/t/ann-sequel-3-12-0-released/189487>\
**Category:** Ruby\
**Created:** [June 1, 2010, 5:43pm UTC](https://www.ruby-forum.com/t/ann-sequel-3-12-0-released/189487 "2010-06-01T17:43:35Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![nerdmaster](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/c68b51/32.png) [@nerdmaster](https://www.ruby-forum.com/u/nerdmaster)\
**Post date:** [June 1, 2010, 5:43pm UTC](https://www.ruby-forum.com/t/ann-sequel-3-12-0-released/189487/1 "2010-06-01T17:43:35Z")

</div>

Sequel is a lightweight database access toolkit for Ruby.

- Sequel provides thread safety, connection pooling and a concise DSL  
for constructing database queries and table schemas.
- Sequel also includes a lightweight but comprehensive ORM layer for  
mapping records to Ruby objects and handling associated records.
- Sequel supports advanced database features such as prepared  
statements, bound variables, stored procedures, master/slave  
configurations, and database sharding.
- Sequel makes it easy to deal with multiple records without having  
to break your teeth on SQL.
- Sequel currently has adapters for ADO, Amalgalite, DataObjects,  
DB2, DBI, Firebird, Informix, JDBC, MySQL, ODBC, OpenBase, Oracle,  
PostgreSQL and SQLite3.

Sequel 3.12.0 has been released and should be available on the gem  
mirrors.

= Migration Changes

- A TimestampMigrator has been added to Sequel, and is  
automatically used if any migration has a version greater than  
20000100. This migrator operates similarly to the default  
ActiveRecord migrator, in that it allows missing migrations.  
It differs from the ActiveRecord migrator in that it supports  
migrations with the same timestamp/version as well as a wide  
variety of timestamp formats (though the ActiveRecord default  
of YYYYMMDDHHMMSS is recommended and should be used in  
portable code).

- A new migration DSL was added:

- The default migrator also had significant issues fixed. First,  
it now saves the migration version after each migration, instead  
of after all migrations, which means Sequel won’t attempt to  
apply already applied migrations if there was previously an error  
when applying multiple migrations at once on a database that  
didn’t support transactional schema modification.

- Execution times for migrations are now logged to the database’s  
loggers.

= New Plugins

- A sharding plugin has been added that allows model objects to  
work well with sharded databases. When using it, model objects  
know which shard they were retrieved from, so when you save  
the object, it is saved back to that shard. The sharding plugin  
also works with associations, so associated records are retrieved  
from the same shard the main object was retreived from. The  
sharding plugin also works with both methods of eager loading, and  
provides methods that you can use to create objects on specific  
shards.

- An update\_primary\_key plugin has been added that allows Sequel  
to work correctly if you modify the primary key of a model object.  
This should not be necessary if you are using surrogate keys, but  
if your database uses natural primary keys which can change, this  
should be helpful.

- An association\_pks plugin has been added that adds association\_pks  
and association\_pks= methods to model objects for both one\_to\_many  
and many\_to\_many associations. The association\_pks method returns  
an array of primary key values for the associated objects, and  
the association\_pks= method modifies the database to ensure that  
the object is only associated to the objects specified by the  
array of primary keys provided to it.

- A string\_stripper plugin has been added that strips all strings  
that are assigned to attribute values. This is useful for web  
applications where you want to easily remove leading and trailing  
whitespace in form entries before storing them in the database.

- A skip\_create\_refresh plugin has been added that skips the refresh  
of after you save a new model object. On most databases, Sequel  
refreshes the model object after inserting it in order to get  
values for all of the columns. For performance reasons, you can  
use this plugin to skip the refresh if it isn’t necessary for you.

= Other New Features

- Sequel::Model#set\_fields and update\_fields were added. These  
methods have a similar API to set\_only and update\_only, but they  
operate differently. While set\_only and update\_only operate over  
the hash, these methods operate over the array of fields,  
so they don’t raise errors if the hash contains fields not  
in the array:

- The :eager\_loader association option has a new API, though the  
previous API still works. Instead of accepting three arguments,  
it can now accept a single hash argument, which will use the  
:key\_hash, :rows, and :association keys for the previous three  
arguments. The hash will also contain a :self key whose value  
is the dataset doing the eager load, which was not possible to  
determine using the old API.

- Sequel::SQL::Expression#hash has been added so that the objects  
are now safe to use as hash keys.

- A Dataset#order\_prepend method has been added allowing you to  
prepend to an existing order. This is useful if want to modify  
a dataset’s order such that it first orders by the columns you  
provide, but for any rows where the columns you provide are  
equal, uses the existing order to further order the dataset:

- When creating foreign key columns, you can now use a :deferrable  
option to set up a foreign key constraint that is not checked  
until the end of the transaction:

- many\_to\_many associations now support a :join\_table\_block option  
that is used by the add/remove/remove\_all methods. It can modify  
the dataset to ensure that certain columns are included when  
inserting or to add a filter so that only certain records are  
deleted. It’s useful if you have a many\_to\_many association that  
is filtered to only a subset of the matching rows in the join  
table.

- The single\_table\_inheritance plugin now supports :model\_map and  
:key\_map options to set up a custom mapping of column values to  
model classes. For simple situations such as when you are mapping  
integer values to certain classes, a :model\_map hash is sufficient:

- The single\_table\_inheritance plugin now correctly sets up subclass  
filters for middle tables in a class hierarchy with more than 2  
levels. For example, with this code:

- Sequel::Model.qualified\_primary\_key\_hash has been added, giving  
you a hash that can be used for filtering. It is similar to  
primary\_key\_hash, but it qualifies the keys with the model’s  
table. It’s useful if you have joined the table to another table  
that has columns with the same name, but you want to only look  
for a single model object in that dataset.

- For consistency, you can now use Dataset#order\_append as an alias  
for order\_more.

= Other Improvements

- Sequel now correctly removes schema entries when altering tables.  
Previously, some adapters that had to query the existing schema  
when altering tables resulted in the previous schema being cached.

- Sequel::Model::Errors#on now always returns nil if there are no  
errors on the attribute. Previously, it would return an empty  
array in certain cases. Additionally, Sequel::Model::Errors#empty?  
now returns true if there are no errors, where it certain cases  
it would return false even if there were no errors.

- The schema\_dumper extension now works with tables specified as  
Sequel::SQL::Identifiers.

- Sequel now recognizes the timestamp(N) with(out) time zone column  
type.

- The lazy\_attributes plugin no longer requires the core extensions  
to work correctly.

- DatabaseDisconnectError support has been added to the ODBC adapter,  
allowing Sequel to detect disconnects and remove the connection  
from the connection pool.

- A leak of JDBC statement objects when using transactions was  
fixed in the jdbc adapter.

- The jdbc adapter now gives a nicer error message if you use a  
connection string that it doesn’t recognize and there is an error  
when connecting.

- Temporary table creation was fixed on Microsoft SQL Server, but  
it is not recommended as it changes the name of the table. If  
you use Microsoft SQL Server, you should prefix your temporary  
table names with # and use the regular create table method.

- A large number of guides were added to Sequel to make it easier  
for new and existing users to learn more about Sequel. The  
following guides were added:

- RDoc section support was added to Sequel::Database, making the  
method documentation easier to read.

= Backwards Compatibility

- Sequel::Database now defines the indexes and tables methods, even  
if the adapter does not implement them, similar to how connect  
and execute are defined. Previously, you could use respond\_to? to  
check if the adapter supported them, now they raise  
Sequel::NotImplemented if the database adapter does not implement  
them.

- Sequel used to raise NotImplementedError in certain default  
definitions of methods inside Sequel::Database and Sequel::Dataset,  
when the methods were supposed to be overridden in subclasses.  
Sequel now uses a Sequel::NotImplemented exception class for these  
exceptions, which is a subclass of Sequel::Error.

- Sequel no longer applies all association options to the dataset  
used to remove all many\_to\_many associated objects. You should  
use the new :join\_table\_block option to get similar behavior if  
you were filtering the many\_to\_many association based on columns  
in the join table and you wanted remove\_all to only remove the  
related columns.

- Sequel now calls certain before and after hook actions in plugins  
in a different order than before. This should not have an effect  
unless you were relying on them being called in the previous order.  
Now, when overriding before hooks in plugins, Sequel always does  
actions before calling super, and when overriding after hooks in  
plugins, Sequel always does actions after calling super.

- The hook\_class\_methods plugin no longer skips later after hooks if  
a previous after hook returns false. That behavior now only occurs  
for before hooks.

- Sequel now only removes primary key values when updating objects if  
you are saving the entire object and you have not modified the  
values of the primary keys. Previously, Sequel would remove  
primary key values when updating even if you specified the primary  
key column specifically or the primary key column was modified and  
you used save\_changes/update.

- Sequel now uses explicit methods instead of aliases for certain  
methods. This should only affect you if for example you overrode  
Dataset#group to do one thing and wanted Dataset#group\_by to do  
the default action. Now, Dataset#group\_by, and methods like it, are  
explicit methods that just call the methods they previously  
aliased. This also means that if you were overriding Dataset#group  
and explicitly aliasing group\_by to it, you no longer need the  
alias.

- The single\_table\_inheritance plugin now uses IN instead of = for  
subclass filters. This could lead to poor performance if the  
database has a very bad query planner.

- The private transaction\_statement\_object method was removed from  
the JDBC adapter, and Sequel will no longer check for the presence  
of the method in the transaction code.

- The Sequel::Migrator object is now a class instead of a module, and  
has been pretty much rewritten. If you were using any methods of  
it besides apply and run, they no longer work.

Thanks,  
Jeremy

- {Website}[[http://sequel.rubyforge.org](http://sequel.rubyforge.org)]
- {Source code}[[GitHub - jeremyevans/sequel: Sequel: The Database Toolkit for Ruby](http://github.com/jeremyevans/sequel)]
- {Blog}[[http://sequel.heroku.com](http://sequel.heroku.com)]
- {Bug tracking}[[Google Code Archive - Long-term storage for Google Code Project Hosting.](http://code.google.com/p/ruby-sequel/issues/list)]
- {Google group}[[http://groups.google.com/group/sequel-talk](http://groups.google.com/group/sequel-talk)]
- {RDoc}[[http://sequel.rubyforge.org/rdoc](http://sequel.rubyforge.org/rdoc)]
