Sequel is a lightweight database access toolkit for Ruby.
- Sequel provides thread safety, connection pooling and a concise
DSL for constructing SQL queries and table schemas. - Sequel includes a 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, savepoints,
two-phase commit, transaction isolation, master/slave
configurations, and database sharding. - Sequel currently has adapters for ADO, Amalgalite, DataObjects,
DB2, DBI, Firebird, IBM_DB, Informix, JDBC, MySQL, Mysql2, ODBC,
OpenBase, Oracle, PostgreSQL, SQLite3, Swift, and TinyTDS.
Sequel 3.35.0 has been released and should be available on the gem
mirrors.
= New Features
-
A dirty plugin has been added, which saves the initial value of
the column when the column is changed, similar to
ActiveModel::Dirty:artist.name # => ‘Foo’
artist.name = ‘Bar’
artist.initial_value(:name) # ‘Foo’
artist.column_change(:name) # [‘Foo’, ‘Bar’]
artist.column_changes # {:name => [‘Foo’, ‘Bar’]}
artist.column_changed?(:name) # true
artist.reset_column(:name)
artist.name # => ‘Foo’
artist.column_changed?(:name) # false
artist.update(:name=>‘Bar’)
artist.column_changes # => {}
artist.previous_changes # => {:name=>[‘Foo’, ‘Bar’]} -
Database#create_table now respects an :as option to create a
database based on the results of a query. The :as option value
should either be an SQL string or a dataset.DB.create_table(:new_foos, :as=>DB[:foos].where(:new=>true))
-
The json_serializer and xml_serializer plugins can now serialize
arbitrary arrays of model objects by passing an :array option
to the to_json class method. This works around an issue in
ruby’s JSON library where Array#to_json does not pass arguments
given to it to the members of the array.Artist.to_json(:array=>[Artist[1]], :include=>:albums)
-
You can now use the % (modulus) operator in the same way you
can use the bitwise operators in Sequel::column.sql_number % 1 # (column % 1)
-
On PostgreSQL, you can now provide :only, :cascade, and :restart
options to Dataset#truncate to use ONLY, CASCADE, and
RESTART IDENTITY. Additionally, you can now truncate multiple
tables at the same time:DB.from(:table1, :table2).truncate(:cascade=>true)
-
The :index option when creating columns in the schema generator
can now take a hash of index options:DB.create_table(:foo){Integer :bar, :index=>{:unique=>true}}
-
A Database#cache_schema accessor has been added, it can be set
to false to have the Database never cache schema results. This
can be useful in Rails development mode, so that you don’t need to
restart a running server to have models pick up the new schema. -
Database#log_exception has been added for easier instrumentation.
It is called with the exception and SQL query string for all
queries that raise an exception. -
The Sequel.migration DSL now has a transaction method that forces
transaction use for the given migration.
= Other Improvements
-
Many theoretical thread-safety issues have been fixed for ruby
implementations that don’t use a global interpreter lock.
Previously, Sequel relied on MRI’s global interpreter lock for
part of its thread safety, now it does manually locking in more
places to avoid thread-safety issues on JRuby (and other ruby
implementations without a global interpreter lock).No Sequel user ever reported a production error related to the
previous thread-safety issues, and most of the issues fixed
were so difficult to hit that even tests specifically designed
to raise errors were unable to do so. -
Sequel.single_threaded = true now disables the mutex
synchronization that enforces thread safety for additional
performance in single threaded mode. -
Sequel’s migrators now only attempt to use transactions by
default if the underlying database supports transactional DDL.
SQLite does support transactional DDL, but Sequel will not
use transactions for SQLite migrations as it causes issues
when emulating alter_table operations for tables with foreign
keys. -
Errors that occur when rolling back database transactions are
now handled correctly. Previously, the underlying exception was
raised, it wasn’t correctly wrapped in a Sequel::DatabaseError,
and if it was due to a database disconnection, the connection
wasn’t removed from the pool. -
Sequel no longer sets ruby instance variables on java objects,
fixing warnings on JRuby 1.7 and attempting to be forward
compatible with JRuby 2.0. -
Sequel now uses date and timestamp formats that are multilanguage
and not DATEFORMAT dependent on Microsoft SQL Server. -
Sequel now correctly escapes blackslash-carriage return-line feed
on Microsoft SQL Server. -
Parsing the column default values in the oracle adapter no longer
requires database superuser privileges. -
Sequel now correctly handles parsing schema for tables in other
databases on MySQL. Previously, it would always look in the
current database. -
Sequel no longer doubles backslashes in strings by default. It
now only does so on MySQL, since that is the only database that
appears to use backslashes for escaping. This fixes issues with
backslashes being doubled on some of the less commonly used
adapters. -
The pg_auto_parameterize extension now works correctly when
using cursors. -
Dataset#truncate now raises an Error if you attempt to do so
on a dataset that uses HAVING. Previously, it only checked for
WHERE. -
The schema dumper now recognized the identity type.
= Backwards Compatibility
-
Association reflections now store cached information in a
separate subhash due to the thread-safety changes. Any code
accessing an association reflection should always call the
related method to get the cached data instead of checking
for a specific location in the hash. -
Association reflection internals for many_through_many associations
changed significantly, any code that accesses the edge information
in the reflection will need to be changed to use the new methods
instead of accessing the old values directly. -
The features deprecated in 3.34.0 have now been removed:
- Ruby <1.8.7 support
- PostgreSQL <8.2 support
- Dataset#disable_insert_returning on PostgreSQL
- Array#all_two_pairs? and #sql_expr_if_all_two_pairs
Thanks,
Jeremy
- {Website}[http://sequel.rubyforge.org]
- {Source code}[GitHub - jeremyevans/sequel: Sequel: The Database Toolkit for Ruby]
- {Blog}[http://sequel.heroku.com]
- {Bug tracking}[Issues · jeremyevans/sequel · GitHub]
- {Google group}[http://groups.google.com/group/sequel-talk]
- {RDoc}[http://sequel.rubyforge.org/rdoc]