Awesome, thanks! I espacially like the constraint_validations extension. :)

best
Florian

Jeremy Evans wrote:
> 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.39.0 has been released and should be available on the gem
> mirrors.
> 
> 
> = New Features
> 
> * A constraint_validations extension and plugin have been added,
>   which allow you to define validations when creating tables,
>   which are enforced by database constraints, and have those
>   validations be automatically discovered and used by your
>   Sequel::Model classes.
> 
>   The extension is designed to be used in your migrations/schema
>   modification code:
> 
>     DB.extension(:constraint_validations)
>     DB.create_constraint_validations_table
>     DB.create_table(:foos) do
>       primary_key :id
>       String :name
> 
>       validate do
>         min_length 5, :name
>       end
>     end
> 
>   This creates a database CHECK constraint that ensures that the
>   minimum length for the column is 5 characters.  It also adds
>   metadata about the validation to the
>   sequel_constraint_validations table.
> 
>   To have the model class automatically create validations, just
>   include the plugin in the model:
> 
>     class Foo < Sequel::Model
>       plugin :constraint_validations
>     end
> 
>   Note that MySQL does not enforce CHECK constraints (it parses
>   but ignores them), so using the extension on MySQL does not
>   actually enforce constraints at the database level, though it
>   still does support the automatic model validations if the plugin
>   is used.
> 
> * Dataset#count now takes an argument or a virtual row block,
>   allowing you to do:
> 
>     DB[:table].count(:column_name)
>     DB[:table].count{function_name(column1, column2)}
> 
>   When count is given an argument, instead of returning the total
>   number of rows, it returns the number of rows where the
>   argument has a non-NULL value.
> 
> * Database#copy_into has been added to the postgres adapter when
>   the pg driver is being used, and can be used for very fast
>   inserts into tables if you already have the input preformatted
>   in PostgreSQL text or CSV format.
> 
> * set_table_not_null has been added to the alter table generator,
>   for a nicer API:
> 
>     alter_table(:t){set_column_not_null :col}
>     # instead of
>     alter_table(:t){set_column_allow_null :col, false}
> 
>   Additionally, set_column_allow_null now defaults the second
>   argument to true for a nicer API:
> 
>     alter_table(:t){set_column_allow_null :col}
>     # instead of
>     alter_table(:t){set_column_allow_null :col, true}
> 
> * Database#supports_regexp? has been added for checking if the
>   database supports Regexp in filters.  Currently, only MySQL and
>   PostgreSQL support Regexps.
> 
>   Attempting to use a Regexp on a database that doesn't support it
>   now raises an error when attempting to generate the SQL, instead
>   of sending invalid SQL to the database.
> 
> * Sequel.char_length has been added for a cross platform
>   char_length function (emulated when char_length is not supported
>   natively by the database).
> 
> * Sequel.trim has been added for a cross platform trim function
>   (emulated when trim is not supported natively by the database).
> 
> * ValidationFailed and HookFailed exceptions now have a model method
>   that returns the model instance related to the exception.  This
>   makes it possible to use Model.create inside a begin/rescue block
>   and get access to the underlying instance if there is a validation
>   or before/around hook error.
> 
> * The subclasses plugin now accepts a block, which is called with
>   each model class created.  This is useful if you want to apply
>   changes to classes created in the future instead of just existing
>   classes.
> 
> * The validates_unique validation in the validation_helpers plugin
>   now accepts a :where option for a custom uniqueness filter.  Among
>   other things this makes it easy to implement a case insensitive
>   uniqueness validation on a case sensitive column.
> 
> * The threaded connection pools now support a
>   :connection_handling=>:disconnect option, which makes them disconnect
>   connections after use instead of returning them to the pool.  This
>   makes it possible to completely control connection lifetime using
>   Database#synchronize.
> 
> * The pg_row_op extension now has support for PGRowOp#*, for referencing
>   the members of the composite type as separate columns.
> 
> * MySQL's set type and default value are now recognized.
> 
> * bin/sequel now accepts a -c argument for running an arbitrary
>   code string instead of using an IRB prompt.
> 
> = Other Improvements
> 
> * Sequel now parses current date/timestamp column defaults when
>   parsing the schema for a table.  The values will be returned
>   as Sequel::CURRENT_DATE for date columns and
>   Sequel::CURRENT_TIMESTAMP for timestamp columns.
> 
>   The schema_dumper extension will work with these defaults, so
>   if you dump the schema for a table with a column that uses
>   a current timestamp default, the dumped schema will include
>   the default.
> 
>   The defaults setter plugin also works with these changes, so
>   that when new model objects are instantiated, they get the
>   current Date/Time/DateTime values set.
> 
> * On MySQL and PostgreSQL, Sequel will now by default attempt
>   to combine multiple alter_table operations into a single
>   query where it believes it can do so correctly.  This can
>   potentially improve performance ~N times, where N is the number
>   of alter table operations.
> 
>   This can change the SQL used for old migrations (though it
>   shouldn't change the result), and is a potentially risky
>   change.  This may be disabled by default in future versions
>   if it causes problems.
> 
> * The defaults_setter plugin now correctly sets false default
>   values.
> 
> * The schema_dumper plugin now preserves fractional seconds
>   in timestamp column defaults when dumping.
> 
> * Time->DateTime and DateTime->Time typecasts now retain
>   fractional seconds on ruby 1.8.
> 
> * Array arguments passed to most PGArrayOp methods are now
>   automatically wrapped in a PGArray.  If you want to use this
>   support, you need to make sure to load both the pg_array
>   and pg_array_op extensions.
> 
> * Sequel now does a better job of finding the sequence for a
>   given table on PostgreSQL, handling more corner cases.  A small
>   side effect of this is sometimes sequence names will be quoted.
> 
> * Some potential thread-safety issues when using Sequel with
>   PostgreSQL on a non-GVL ruby implementation have been fixed.
> 
> * Sequel now correctly caches the server version query on MySQL.
> 
> * Sets of alter_table operations on MySQL and Microsoft SQL Server
>   that require parsing the current database schema, where later
>   alter_table operations depend on earlier ones, should now work
>   correctly.
> 
> * You can now drop check constraints on tables on SQLite, though
>   doing so drops all check constraints on the table, not only the
>   specific check constraint given.
> 
> * The identity_map plugin no longer breaks if used with a model
>   without a primary key.
> 
> * Sequel::SQL::NegativeBooleanConstant now inherits from Constant
>   instead of BooleanConstant.  This means that
> 
>     Sequel::NULL == Sequel::NOTNULL
> 
>   is now false instead of true.
> 
> * You can now override the convert_tinyint_to_bool settings on a
>   per-Dataset basis in the mysql and mysql2 adapters, though
>   the overriding is different depending on the adapter.  Check the
>   commit log for details.
> 
> * timestamp(N) types are now recognized as datetime, which should
>   fix certain cases on Oracle.
> 
> * Dataset#insert now handles a single model instance argument
>   as a single value if the model uses the pg_row plugin.
> 
> * When joining a model dataset using a model class as the table
>   argument, a subselect is used unless the model is a simple select
>   from the underlying table.
> 
> * The specs now cleanup after themselves, dropping the tables that
>   they create for testing.
> 
> = Backwards Compatibility
> 
> * The defaults_setter plugin's behavior changed due to the
>   current date/timestamp support.  Previously, it would not set
>   a value for the column, since the default wasn't recognized.
>   Therefore, the database would use the default value on insert,
>   which would be the database's current timestamp.
> 
>   Now, the value is set to the current Date/Time/DateTime on
>   model object instantiation, so the database wouldn't use the
>   column default.  Instead of the database's current timestamp
>   on insert, the column value will be the application's
>   current timestamp on model instantiation.
> 
>   Users who don't want this behavior can remove the default values
>   in the model:
> 
>     Model.default_values.delete(:column_name)
> 
> * Plain (non-model) datasets no longer allow insert to accept
>   a single model instance argument.  Also, they no longer call
>   values on a single argument if the object responds to it.
> 
> * Plain (non-model) datasets no longer accept model classes as
>   tables in the join/graph methods.  Also, they no longer call
>   table_name on the argument if the object responds to it.
> 
> * The schema_dumper extension now requires the eval_inspect
>   extension, which changes inspect output for
>   Sequel::SQL::Expression objects.
> 
> * Custom adapters that override Database#alter_table_sql_list now
>   need to make sure it returns an already flattened array.
> 
> * The identity_map_key method in the identity_map plugin now returns
>   nil instead of a random string if the given pk is nil.
> 
> Thanks,
> Jeremy
> 
> * {Website}[http://sequel.rubyforge.org]
> * {Source code}[http://github.com/jeremyevans/sequel]
> * {Blog}[http://sequel.heroku.com]
> * {Bug tracking}[http://github.com/jeremyevans/sequel/issues]
> * {Google group}[http://groups.google.com/group/sequel-talk]
> * {RDoc}[http://sequel.rubyforge.org/rdoc]
> 

-- You received this message because you are subscribed to the Google Groups 
ruby-talk-google group. To post to this group, send email to 
[email protected]. To unsubscribe from this group, send email 
to [email protected]. For more options, visit this 
group at https://groups.google.com/d/forum/ruby-talk-google?hl=en

Reply via email to