ANN: Sequel 2.9.0 Released

  • 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, 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, DB2, DBI, Informix, JDBC,
    MySQL, ODBC, OpenBase, Oracle, PostgreSQL and SQLite3.

Sequel 2.9.0 has been released and should be available on the gem
mirrors. The 2.9.0 release adds numerous improvements:

New Features

  • Compound SQL statement (i.e. UNION, EXCEPT, and INTERSECT) support
    is much improved. Chaining compound statement calls now longer
    wipes out previous compound statements calls of the same type.
    Also, the ordering of the compound statements is no longer fixed
    per adapter, it now reflects the order they were called on the
    object. For example, the following now work as expected:

    ds1.union(ds2).union(ds3)
    ds1.except(ds2).except(ds3)
    ds1.intersect(ds2).intersect(ds3)
    ds1.union(ds2).except(ds3)
    ds1.except(ds2).intersect(ds3)
    ds1.intersect(ds2).union(ds3)

  • Exception classes ValidationFailure and BeforeHookFailure were
    added so it is eaiser to catch a failed validation. These are
    both subclasses of Sequel::Error, so there shouldn’t be any
    backwards compatibility issues. Error messages are also improved,
    as the ValidationFailure message is a string containing all
    validation failures and the BeforeHookFailure message contains
    which hook type caused the failure (i.e. before_save,
    before_create, or before_validate).

  • The sequel command line tool now has a -L option to load
    all files in the given directory. This is mainly useful for
    loading a directory of model files. The files are loaded
    after the database connection is set up.

  • Methods to create and drop database functions, triggers, and
    procedural languages were added to the PostgreSQL adapter.

Other Improvements

  • Database#schema now raises an error if you pass a table that
    doesn’t exist. Before, some adapters would return an empty schema.
    The bigger problem with this is that it made table_exists? return
    the wrong value, since it looks at the Database’s schema.
    Generally, this bug would show up in the following code:

    class Blah < Sequel::Model
    end
    Blah.table_exists? # True even if blahs is not a table

  • AlterTableGenerator#add_foreign_key now works for MySQL.

  • Error messages in model association methods that add/remove an
    associated object are now more descriptive.

  • Dataset#destroy for model datasets now works with databases that
    can’t handle nested queries. However, it now loads all model
    objects being destroyed before attempting to destroy any of them.

  • Dataset#count now works correctly for compound SQL statements
    (i.e. UNION, EXCEPT, and INTERSECT).

  • BigDecimal NaN and (+/-)Infinity values are now literalized
    correctly. Database support for this is hit or miss. Sqlite will
    work correctly, PostgreSQL raises an error if you try to store an
    infinite value in a numeric column (though it works for float
    columns), and MySQL converts all three to 0.

  • The SQLite adapter no longer loses primary key information when
    dropping columns.

  • The SQLite adapter now supports dropping indicies.

  • A bug in the MSSQL adapter’s literalization of LiteralStrings has
    been fixed.

  • The literalization of blobs on PostgreSQL (bytea columns) has been
    fixed.

  • Sequel now raises an error if you attempt to subclass Sequel::Model
    before setting up a database connection.

  • The native postgresql adapter has been changed to only log client
    messages of level WARNING by default. You can modify this via:

    Sequel::Postgres.client_min_messages = nil # Use Server Default
    Sequel::Postgres.client_min_messages = :notice # Use NOTICE level

  • Model#inspect now calls Model#inspect_values for easier
    overloading.

Backwards Compatibilty

  • The API to Model#save_failure (a private method) was changed to
    remove the second argument.

  • SQLite columns with type numeric, decimal, or money are now
    returned as BigDecimal values. Before, they were probably returned
    as strings.

Thanks,
Jeremy