= Major Changes * Datasets are now frozen by default. Since Sequel's inception, datasets have used a method-chaining API that returned modified copies, but previously they still supported direct mutation. Now, datasets are always frozen and cannot be mutated. This allows many additional default optimizations related to caching, and provides greater thread safety. ds = DB[:table] # Before ds.row_proc = lambda{|h| h} # Now ds = ds.with_row_proc(lambda{|h| h}) * Symbol splitting to create qualified and/or aliased identifiers is now disabled by default. While symbol splitting allowed for shorter code, it was not obvious and caused significant issues when using column names with embedded double or triple underscores. Sequel now offers many ways to create qualified and/or aliased identifiers. # Before :table__column # "table"."column" # Now :table__column # "table__column" Sequel[:table][:column] # "table"."column" # To get back historical behavior Sequel.split_symbols = true * Sequel no longer allows the use of plain ruby strings as SQL code fragments in the dataset filtering methods, as that makes it easier to introduce SQL injection vulnerabilities. You can use Sequel.lit to create literal strings (SQL code fragments), which makes it easier to do security auditing of applications using Sequel. # Before DB[:table].where("column = 1").all # Now DB[:table].where(Sequel.lit("column = 1")).all # or better DB[:table].where(column: 1).all # To get back historical behavior DB.extension :auto_literal_strings = Backwards Compatibility * All adapters, extensions, plugins, features, and constants deprecated in 4.49.0 have been removed. Before upgrading to Sequel 5.0.0, upgrade to 4.49.0 and fix all deprecation warnings. * Support for ruby 1.8.7 has been dropped, the minimum ruby version is now 1.9.2. * The {before,after,around}_validation hooks are now always called when saving, even if the validate: false option is used. This allows you to use the before_validation hook to make changes to the model instance that are required before validation and before saving even if not validating. * Getting column values for newly created model instances after insertion now happens before after_create is called, instead of after. * Sequel now immediately attempts to the connect to the database when a Database instance is created, in order to fail fast if the connection parameters are invalid. * The validates_unique method in the validation_helpers plugin now only checks for uniqueness by default if the record is new or one of the related columns has been modified by default. * Database schema modification methods and schema generator methods now return nil instead of some internal value. * Many cases where Sequel used Kernel#send internally have been switched to Kernel#public_send so they only call public methods. * Model association hooks are now nil instead of empty arrays by default. * Internal uses of instance_eval with a block have been changed to instance_exec. This allows them to be used with lambdas that take no arguments. * Most internal constants are now frozen, unless there is a requirement that they be modified at runtime. * The Model @was_new instance variable is now no longer set when saving new model instances. * The private Sequel::Postgres::PGArray::Parser#new_entry_buffer method in the pg_array extension has been removed. * Modifying Model.input_transformer_order in the input_transformer plugin no longer has an effect. = New Features * Database#add_index :if_not_exists option is now supported on PostgreSQL 9.5+. * SQL::Subscript#expression has been added to retrieve the expression that is subscripted. = Other Improvements * Threaded connection pools no longer block while new connections are being made. Previously, attempting to establish a new connection blocked all connection pool activity until the new connection was made. * Many minor performance improvements have been made. * The class_table_inheritance plugin now raises an error during Model#update if a query does not modify a single row, just as the default Model#update does. * ConnectionPool#size is now thread-safe in both threaded connection pools. Internal callers that already have the connection pool mutex should switch to using #_size (a new private method). * Registration of new serialization formats in the serialization plugin is now thread-safe. * If transactional schema modifications are not supported, a savepoint will not automatically be created when adding indexes for new tables inside transactions. This fixes issues when making schema changes inside transactions on MySQL. * Attempting to create a prepared statement using a dataset that uses a delayed evaluation now raises an error, because the prepared statement would not respect the delayed evaluation. * The bin/sequel -M option now uses base 10. Previously, it used the Kernel#Integer default, which was base 8 if there was a preceding 0. = Deprecated Features These deprecated features will be removed in Sequel 5.1.0. * Model.allowed_columns in the base plugin is now deprecated. Use the whitelist_security plugin if you want to call it. * Model use_after_commit_rollback class and instance accessors are now deprecated. * Defining the Model#_before_validation method is now deprecated. You can change to using before_validation. * The private Model.plugin_module_defined? method is now deprecated.