sequel 2.10.0 → 2.11.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +51 -1
- data/README.rdoc +2 -2
- data/Rakefile +2 -2
- data/doc/advanced_associations.rdoc +6 -18
- data/doc/release_notes/1.0.txt +38 -0
- data/doc/release_notes/1.1.txt +143 -0
- data/doc/release_notes/1.3.txt +101 -0
- data/doc/release_notes/1.4.0.txt +53 -0
- data/doc/release_notes/1.5.0.txt +155 -0
- data/doc/release_notes/2.0.0.txt +298 -0
- data/doc/release_notes/2.1.0.txt +271 -0
- data/doc/release_notes/2.10.0.txt +328 -0
- data/doc/release_notes/2.11.0.txt +215 -0
- data/doc/release_notes/2.2.0.txt +253 -0
- data/doc/release_notes/2.3.0.txt +88 -0
- data/doc/release_notes/2.4.0.txt +106 -0
- data/doc/release_notes/2.5.0.txt +137 -0
- data/doc/release_notes/2.6.0.txt +157 -0
- data/doc/release_notes/2.7.0.txt +166 -0
- data/doc/release_notes/2.8.0.txt +171 -0
- data/doc/release_notes/2.9.0.txt +97 -0
- data/lib/sequel_core/adapters/ado.rb +3 -0
- data/lib/sequel_core/adapters/db2.rb +0 -11
- data/lib/sequel_core/adapters/dbi.rb +0 -11
- data/lib/sequel_core/adapters/do.rb +0 -12
- data/lib/sequel_core/adapters/firebird.rb +21 -16
- data/lib/sequel_core/adapters/informix.rb +1 -11
- data/lib/sequel_core/adapters/jdbc.rb +1 -13
- data/lib/sequel_core/adapters/jdbc/h2.rb +3 -11
- data/lib/sequel_core/adapters/jdbc/mysql.rb +0 -17
- data/lib/sequel_core/adapters/jdbc/postgresql.rb +3 -15
- data/lib/sequel_core/adapters/mysql.rb +31 -27
- data/lib/sequel_core/adapters/odbc.rb +34 -28
- data/lib/sequel_core/adapters/openbase.rb +0 -11
- data/lib/sequel_core/adapters/oracle.rb +11 -9
- data/lib/sequel_core/adapters/postgres.rb +14 -17
- data/lib/sequel_core/adapters/shared/mssql.rb +6 -15
- data/lib/sequel_core/adapters/shared/mysql.rb +29 -14
- data/lib/sequel_core/adapters/shared/oracle.rb +4 -0
- data/lib/sequel_core/adapters/shared/postgres.rb +30 -35
- data/lib/sequel_core/adapters/shared/progress.rb +4 -0
- data/lib/sequel_core/adapters/shared/sqlite.rb +73 -13
- data/lib/sequel_core/adapters/sqlite.rb +8 -18
- data/lib/sequel_core/adapters/utils/date_format.rb +21 -0
- data/lib/sequel_core/{dataset → adapters/utils}/stored_procedures.rb +0 -0
- data/lib/sequel_core/{dataset → adapters/utils}/unsupported.rb +0 -0
- data/lib/sequel_core/core_ext.rb +1 -1
- data/lib/sequel_core/core_sql.rb +9 -4
- data/lib/sequel_core/database.rb +63 -62
- data/lib/sequel_core/dataset.rb +9 -4
- data/lib/sequel_core/dataset/convenience.rb +10 -9
- data/lib/sequel_core/dataset/prepared_statements.rb +1 -1
- data/lib/sequel_core/dataset/sql.rb +130 -36
- data/lib/sequel_core/schema/sql.rb +2 -2
- data/lib/sequel_core/sql.rb +44 -51
- data/lib/sequel_core/version.rb +1 -1
- data/lib/sequel_model/associations.rb +25 -17
- data/lib/sequel_model/base.rb +35 -7
- data/lib/sequel_model/caching.rb +1 -6
- data/lib/sequel_model/record.rb +23 -5
- data/lib/sequel_model/validations.rb +20 -5
- data/spec/adapters/firebird_spec.rb +6 -1
- data/spec/adapters/mysql_spec.rb +12 -0
- data/spec/adapters/postgres_spec.rb +2 -2
- data/spec/adapters/sqlite_spec.rb +81 -2
- data/spec/integration/dataset_test.rb +2 -2
- data/spec/integration/type_test.rb +12 -2
- data/spec/sequel_core/core_sql_spec.rb +46 -12
- data/spec/sequel_core/database_spec.rb +24 -12
- data/spec/sequel_core/dataset_spec.rb +82 -32
- data/spec/sequel_core/schema_spec.rb +16 -0
- data/spec/sequel_model/associations_spec.rb +89 -0
- data/spec/sequel_model/base_spec.rb +66 -0
- data/spec/sequel_model/eager_loading_spec.rb +32 -0
- data/spec/sequel_model/record_spec.rb +9 -9
- data/spec/sequel_model/spec_helper.rb +3 -0
- data/spec/sequel_model/validations_spec.rb +63 -3
- metadata +41 -4
@@ -0,0 +1,215 @@
|
|
1
|
+
Optimizations
|
2
|
+
-------------
|
3
|
+
|
4
|
+
* Model.[] was optimized to use static SQL in cases where doing so
|
5
|
+
should result in the same output. This should result in a 30-40%
|
6
|
+
performance increase. Since this can be the most significant or
|
7
|
+
only method call in a web application action, this has potential
|
8
|
+
to significantly enhance the performance of web application code.
|
9
|
+
|
10
|
+
In order for this optimization to have an effect, you need to
|
11
|
+
make sure that you are calling set_dataset with a Symbol and
|
12
|
+
not a Dataset object:
|
13
|
+
|
14
|
+
# Optimized:
|
15
|
+
class Foo < Sequel::Model; end
|
16
|
+
class Foo < Sequel::Model(:foos); end
|
17
|
+
class Foo < Sequel::Model
|
18
|
+
set_dataset :foos
|
19
|
+
end
|
20
|
+
|
21
|
+
# Not Optimized, but otherwise equivalent:
|
22
|
+
class Foo < Sequel::Model(Model.db[:foos]); end
|
23
|
+
class Foo < Sequel::Model
|
24
|
+
set_dataset db[:foos]
|
25
|
+
end
|
26
|
+
|
27
|
+
* Dataset#literal was refactored for performance reasons to make
|
28
|
+
overriding it in subclasses unnecessary. The changes made result
|
29
|
+
in a 20-25% performance increase. Sequel can spend about 10% of
|
30
|
+
it's time in Dataset#literal, so this may be only a 2% overall
|
31
|
+
performance improvement.
|
32
|
+
|
33
|
+
New Features
|
34
|
+
------------
|
35
|
+
|
36
|
+
* Association datasets now know about the model objects that created
|
37
|
+
them, as well as the related association reflection. This makes
|
38
|
+
association extensions much more powerful. For example, you can
|
39
|
+
now create generic association extensions such as:
|
40
|
+
|
41
|
+
module FindOrCreate
|
42
|
+
def find_or_create(vals)
|
43
|
+
first(vals) || association_reflection.associated_class. \
|
44
|
+
create(vals.merge(association_reflection[:key]=> \
|
45
|
+
model_object.id))
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
The above will work for any standard one_to_many association:
|
50
|
+
|
51
|
+
Artist.one_to_many :albums, :extend=>FindOrCreate
|
52
|
+
# Create an album named Foo related to this artist,
|
53
|
+
# unless such an album already exists
|
54
|
+
Artist.first.albums_dataset.find_or_create(:name=>'Foo')
|
55
|
+
|
56
|
+
Before, the only way to do the above was to use a closure inside
|
57
|
+
the :dataset option proc, which couldn't be done generically
|
58
|
+
for multiple associations.
|
59
|
+
|
60
|
+
* A :conditions association option was added, which allows simple
|
61
|
+
filters to be set up without defining :graph_conditions and
|
62
|
+
an association block:
|
63
|
+
|
64
|
+
# 2.10.0
|
65
|
+
one_to_many(:japanese_verses, :class=>:Verse, \
|
66
|
+
:graph_conditions=>{:languageid=>3})do |ds|
|
67
|
+
ds.filter(:languageid=>3)
|
68
|
+
end
|
69
|
+
# 2.11.0
|
70
|
+
one_to_many(:japanese_verses, :class=>:Verse, \
|
71
|
+
:conditions=>{:languageid=>3})
|
72
|
+
|
73
|
+
* A :clone association option was added, which allows you to clone
|
74
|
+
an existing association. This is most useful when you are dealing
|
75
|
+
with a legacy schema and had to define the same options redundantly
|
76
|
+
for each type of association. You can now do:
|
77
|
+
|
78
|
+
many_to_many :deputies, :class=>:Employee, \
|
79
|
+
:join_table=>:employeecurrentaudits, :left_key=>:currentauditid, \
|
80
|
+
:right_key=>:employeeid, :order=>[:firstname, :lastname] do |ds|
|
81
|
+
ds.filter(:active).filter(:capacity=>1)
|
82
|
+
end
|
83
|
+
many_to_many :project_managers, :clone=>:deputies do |ds|
|
84
|
+
ds.filter(:active).filter(:capacity=>2)
|
85
|
+
end
|
86
|
+
many_to_many :team_leaders, :clone=>:deputies do |ds|
|
87
|
+
ds.filter(:active).filter(:capacity=>3)
|
88
|
+
end
|
89
|
+
|
90
|
+
All of the above would use the same :class, :join_table, :left_key,
|
91
|
+
:right_key, and :order options. If you don't provide an
|
92
|
+
association block, but you are cloning an association that has one,
|
93
|
+
the cloned association's block is used. You can use the
|
94
|
+
:block=>nil option to not use a block even if the cloned
|
95
|
+
association has a block.
|
96
|
+
|
97
|
+
* Dataset#select, #select_more, #order, #order_more, and #get all
|
98
|
+
take a block that yields a Sequel::SQL::VirtualRow instance,
|
99
|
+
similar to the behavior of filter. This allows for the easier
|
100
|
+
use of SQL functions on Ruby 1.9:
|
101
|
+
|
102
|
+
# 2.10.0
|
103
|
+
dataset.select(:prettify.sql_function(:name))
|
104
|
+
# 2.11.0
|
105
|
+
dataset.select{|o| o.prettify(:name)}
|
106
|
+
|
107
|
+
* String#lit can now accept arguments and return an SQL literal
|
108
|
+
string. This allows you to do things that were previously hard
|
109
|
+
or at least unnecessarily verbose. For example, you can now
|
110
|
+
easily use the SQL standard SUBSTRING function:
|
111
|
+
|
112
|
+
column = :user
|
113
|
+
pattern = params[:pattern]
|
114
|
+
dataset.select{|o| o.substring('? from ?'.lit(column, pattern))}
|
115
|
+
|
116
|
+
* A validates_inclusion_of validation method was added to Model. You
|
117
|
+
can provide a Range or an Array in the :in option to specify the
|
118
|
+
allowed values:
|
119
|
+
|
120
|
+
validates_inclusion_of :value, :in=>1..5
|
121
|
+
validates_inclusion_of :weekday, :in=>%w'Monday Tuesday ...'
|
122
|
+
|
123
|
+
* Dataset#with_sql was added, which returns a copy of the dataset
|
124
|
+
with static SQL. This is useful if you want to keep the same
|
125
|
+
row_proc/graph/transform/etc., but want to use your own custom
|
126
|
+
SQL.
|
127
|
+
|
128
|
+
Other Improvements
|
129
|
+
------------------
|
130
|
+
|
131
|
+
* You can now use Sequel's database independent types when casting:
|
132
|
+
|
133
|
+
dataset.select(:number.cast(String))
|
134
|
+
|
135
|
+
Among other things, the default cast types for cast_string and
|
136
|
+
cast_numeric now work in the MySQL adapter.
|
137
|
+
|
138
|
+
* Model#set_associated_object was added. The many_to_one association
|
139
|
+
setter method calls it. This allows you to easily override the
|
140
|
+
association setters for all many_to_one associations of a class
|
141
|
+
by modifying a single method.
|
142
|
+
|
143
|
+
* Typecasting invalid date strings now raises a
|
144
|
+
Sequel::Error::InvalidValue instead of an argument error, which
|
145
|
+
means that you can use raise_on_typecast_failure = false and not
|
146
|
+
have an error raised when an invalid date format is used.
|
147
|
+
|
148
|
+
* String#to_sequel_blob was added and should now be used instead
|
149
|
+
of String#to_blob. sqlite3-ruby defines String#to_blob
|
150
|
+
differently, which could cause problems.
|
151
|
+
|
152
|
+
* Blob columns are now fully supported in the SQLite adapter, with
|
153
|
+
the hex escape syntax being used for input, and returning columns
|
154
|
+
of type Sequel::SQL::Blob on output.
|
155
|
+
|
156
|
+
* The SQLite adapter drop_column support is now significantly more
|
157
|
+
robust.
|
158
|
+
|
159
|
+
* The SQLite adapter now supports rename_column.
|
160
|
+
|
161
|
+
* The MySQL adapter now supports stored procedures with multiple
|
162
|
+
arguments.
|
163
|
+
|
164
|
+
* The MySQL adapter can now not use a compressed connection to the
|
165
|
+
server via the :compress=>false option.
|
166
|
+
|
167
|
+
* The MySQL adapter now sets a default timeout of 30 days to the
|
168
|
+
database connection, you can change it via the :timeout option,
|
169
|
+
which accepts a number of seconds.
|
170
|
+
|
171
|
+
* The MySQL adapter now sets SQL_AUTO_IS_NULL to false by default,
|
172
|
+
you can use the :auto_is_null=>true option to not do this.
|
173
|
+
|
174
|
+
* The MySQL adapter now sets the encoding option on the database
|
175
|
+
connection itself, so it works across reconnects.
|
176
|
+
|
177
|
+
* Sequel itself no longer uses String#lit or Symbol#* internally, so
|
178
|
+
it shouldn't break if another library defines them.
|
179
|
+
|
180
|
+
* The default index name is now generated correctly if a non-String
|
181
|
+
or Symbol column is used.
|
182
|
+
|
183
|
+
* Some ruby -w warnings have been fixed.
|
184
|
+
|
185
|
+
* INSERTs are now sent to the master database instead of the slave
|
186
|
+
database(s) if using a master/slave database configuration and
|
187
|
+
PostgreSQL 8.2+ or Firebird.
|
188
|
+
|
189
|
+
* DateTime literalization has been fixed in the Firebird adapter.
|
190
|
+
|
191
|
+
* Date literalization has been fixed in the H2 JDBC subadapter.
|
192
|
+
|
193
|
+
* Release notes for versions from 1.0 to the present are now included
|
194
|
+
in the Sequel repository and the RDoc documentation, see
|
195
|
+
http://sequel.rubyforge.org/rdoc/files/doc/release_notes/
|
196
|
+
|
197
|
+
Backwards Compatibilty
|
198
|
+
----------------------
|
199
|
+
|
200
|
+
* The optimization of Model.[] may break if you modify the model's
|
201
|
+
dataset behind its back. Always use Model.set_dataset if you
|
202
|
+
want to change a Model's dataset.
|
203
|
+
|
204
|
+
* Sequel::Dataset::UnsupportedExceptIntersect and
|
205
|
+
Sequel::Dataset::UnsupportedExceptIntersectAll will now only be
|
206
|
+
defined if you are using an adapter that requires them.
|
207
|
+
|
208
|
+
* The private Model#cache_delete_unless_new method has been removed.
|
209
|
+
|
210
|
+
* Sequel::SQL::IrregularFunction was removed, as it was a bad hack
|
211
|
+
that is not used by Sequel anymore. Unless you were instantiating
|
212
|
+
it directly or using a plugin/extension that did, this shouldn't
|
213
|
+
affect you. Using a Sequel::SQL::Function with a
|
214
|
+
Sequel::SQL::PlaceholderLiteralString is recommended instead, see
|
215
|
+
the substring example above.
|
@@ -0,0 +1,253 @@
|
|
1
|
+
The Most Powerful and Flexible Associations of Any Ruby ORM
|
2
|
+
-----------------------------------------------------------
|
3
|
+
|
4
|
+
Sequel can now support any association type supported by
|
5
|
+
ActiveRecord, and many association types ActiveRecord doesn't
|
6
|
+
support.
|
7
|
+
|
8
|
+
Association callbacks (:before_add, :after_add, :before_remove,
|
9
|
+
:after_remove) have been added, and work for all association
|
10
|
+
types. Each of the callback options can be a Symbol specifying an
|
11
|
+
instance method that takes one argument (the associated object), or a
|
12
|
+
Proc that takes two arguments (the current object and the associated
|
13
|
+
object), or an array of Symbols and Procs. Additionally, an
|
14
|
+
:after_load callback is available, which is running after loading the
|
15
|
+
associated record(s) from the database.
|
16
|
+
|
17
|
+
Association extensions are now supported:
|
18
|
+
|
19
|
+
class FindOrCreate
|
20
|
+
def find_or_create(vals)
|
21
|
+
first(vals) || create(vals)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
class Author < Sequel::Model
|
25
|
+
one_to_many :authorships, :extend=>FindOrCreate
|
26
|
+
end
|
27
|
+
Author.first.authorships_dataset.find_or_create(:name=>'Bob')
|
28
|
+
|
29
|
+
Sequel has been able to support most has_many :through style
|
30
|
+
associations since 1.3, via many_to_many (since it doesn't break on
|
31
|
+
join tables that are also model tables, unlike ActiveRecord's
|
32
|
+
has_and_belongs_to_many). Now it can also support has_many :through
|
33
|
+
style associations where it goes through a has_many association.
|
34
|
+
|
35
|
+
Sequel can now support polymorphic associations. Polymorphic
|
36
|
+
associations are really a design flaw, so Sequel doesn't support them
|
37
|
+
directly, but the tools that Sequel gives you make them pretty easy
|
38
|
+
to implement.
|
39
|
+
|
40
|
+
Sequel can also support associations that ActiveRecord does not. For
|
41
|
+
example, a belongs_to association where the column referenced in the
|
42
|
+
associated table is not the primary key, an association that depends
|
43
|
+
on multiple columns in each table, or even situations where the
|
44
|
+
association has a column in the primary table that can be referenced
|
45
|
+
by any of multiple columns in a second table that has a has_one style
|
46
|
+
association with the table you want to associate with.
|
47
|
+
|
48
|
+
Some of those associations can be supported for a single object using
|
49
|
+
custom SQL in ActiveRecord, but none are supported when eager
|
50
|
+
loading or allow further filtering.
|
51
|
+
|
52
|
+
Not only can all of these cases be supported with Sequel::Model, all
|
53
|
+
can be supported with eager loading, and can allow for further
|
54
|
+
filtering. See
|
55
|
+
http://sequel.rubyforge.org/files/sequel/doc/advanced_associations_rdoc.html
|
56
|
+
for details and example code for all association types covered above.
|
57
|
+
|
58
|
+
There have also been many additional options added for controlling
|
59
|
+
eager loading via eager_graph. Every part of the SQL JOINs can now
|
60
|
+
be controlled via one of the options, so you can use JOIN USING,
|
61
|
+
NATURAL JOIN, or arbitrary JOIN ON conditions.
|
62
|
+
|
63
|
+
Finally, just to show off the power that Sequel gives you when eager
|
64
|
+
loading, here is example code that will eagerly load all descendants
|
65
|
+
and ancestors in a tree structure, without knowing the depth of the
|
66
|
+
tree:
|
67
|
+
|
68
|
+
class Node < Sequel::Model
|
69
|
+
set_schema do
|
70
|
+
primary_key :id
|
71
|
+
foreign_key :parent_id, :nodes
|
72
|
+
end
|
73
|
+
create_table
|
74
|
+
|
75
|
+
many_to_one :parent
|
76
|
+
one_to_many :children, :key=>:parent_id
|
77
|
+
|
78
|
+
# Only useful when eager loading
|
79
|
+
many_to_one :ancestors, :eager_loader=>(proc do |key_hash, nodes,
|
80
|
+
associations|
|
81
|
+
# Handle cases where the root node has the same parent_id as
|
82
|
+
primary_key
|
83
|
+
# and also when it is NULL
|
84
|
+
non_root_nodes = nodes.reject do |n|
|
85
|
+
if [nil, n.pk].include?(n.parent_id)
|
86
|
+
# Make sure root nodes have their parent association set to
|
87
|
+
nil
|
88
|
+
n.associations[:parent] = nil
|
89
|
+
true
|
90
|
+
else
|
91
|
+
false
|
92
|
+
end
|
93
|
+
end
|
94
|
+
unless non_root_nodes.empty?
|
95
|
+
id_map = {}
|
96
|
+
# Create an map of parent_ids to nodes that have that parent id
|
97
|
+
non_root_nodes.each{|n| (id_map[n.parent_id] ||= []) << n}
|
98
|
+
# Doesn't cause an infinte loop, because when only the root node
|
99
|
+
# is left, this is not called.
|
100
|
+
Node.filter(Node.primary_key=>id_map.keys).eager(:ancestors).all
|
101
|
+
do |node|
|
102
|
+
# Populate the parent association for each node
|
103
|
+
id_map[node.pk].each{|n| n.associations[:parent] = node}
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end)
|
107
|
+
many_to_one :descendants, :eager_loader=>(proc do |key_hash, nodes,
|
108
|
+
associations|
|
109
|
+
id_map = {}
|
110
|
+
nodes.each do |n|
|
111
|
+
# Initialize an empty array of child associations for each
|
112
|
+
parent node
|
113
|
+
n.associations[:children] = []
|
114
|
+
# Populate identity map of nodes
|
115
|
+
id_map[n.pk] = n
|
116
|
+
end
|
117
|
+
# Doesn't cause an infinite loop, because the :eager_loader is not
|
118
|
+
called
|
119
|
+
# if no records are returned. Exclude id = parent_id to avoid
|
120
|
+
infinite loop
|
121
|
+
# if the root note is one of the returned records and it has
|
122
|
+
parent_id = id
|
123
|
+
# instead of parent_id = NULL.
|
124
|
+
Node.filter(:parent_id=>id_map.keys).exclude(:id=>:parent_id).eager(:descendants).all
|
125
|
+
do |node|
|
126
|
+
# Get the parent from the identity map
|
127
|
+
parent = id_map[node.parent_id]
|
128
|
+
# Set the child's parent association to the parent
|
129
|
+
node.associations[:parent] = parent
|
130
|
+
# Add the child association to the array of children in the
|
131
|
+
parent
|
132
|
+
parent.associations[:children] << node
|
133
|
+
end
|
134
|
+
end)
|
135
|
+
end
|
136
|
+
|
137
|
+
nodes = Node.filter(:id < 10).eager(:ancestors, :descendants).all
|
138
|
+
|
139
|
+
New Adapter Features
|
140
|
+
--------------------
|
141
|
+
|
142
|
+
* PostgreSQL bytea fields are now fully supported.
|
143
|
+
|
144
|
+
* The PostgreSQL adapter now uses the safer connection-specific
|
145
|
+
string escaping if you are using ruby-pg.
|
146
|
+
|
147
|
+
* The SQLite adapter supports drop_column and add_index.
|
148
|
+
|
149
|
+
* You can now use URL parameters in the connection string, enabling
|
150
|
+
you to connect to PostgreSQL via a socket using
|
151
|
+
postgres://user:password@blah/database?host=/tmp
|
152
|
+
|
153
|
+
Other New Features
|
154
|
+
------------------
|
155
|
+
|
156
|
+
* Dataset#graph now takes a block which it passes to join_table.
|
157
|
+
|
158
|
+
* Symbol#identifier has been added, which can be used if another
|
159
|
+
library defines the same operator(s) on Symbol that Sequel defines.
|
160
|
+
|
161
|
+
* Filter blocks now yield a VirtualRow instance, which can yield
|
162
|
+
Identifiers, QualifiedIdentifiers, or Functions. Like
|
163
|
+
Symbol#identifier, this is useful if another library defines the
|
164
|
+
same operator(s) on Symbol that Sequel defines.
|
165
|
+
|
166
|
+
* You can now call Model.to_hash to get an identity map for all
|
167
|
+
rows (before this required Model.dataset.to_hash).
|
168
|
+
|
169
|
+
* A model that can get it's column information from the schema will
|
170
|
+
set it in the dataset, potentially saving many queries.
|
171
|
+
|
172
|
+
* Model.validates_presence_of now works correctly for boolean
|
173
|
+
columns.
|
174
|
+
|
175
|
+
Notable Bug Fixes
|
176
|
+
-----------------
|
177
|
+
|
178
|
+
* Caching now works with Model subclasses.
|
179
|
+
|
180
|
+
* Model validation methods now work with source reloading.
|
181
|
+
|
182
|
+
* The PostgreSQL adapter no longer raises an Error if you try to
|
183
|
+
insert a record with the primary key already specified.
|
184
|
+
|
185
|
+
* Sequel no longer messes with the native MySQL adapter, so you can
|
186
|
+
use Sequel and ActiveRecord with MySQL in the same process.
|
187
|
+
|
188
|
+
* Dataset#count now works correctly for limited dataset.
|
189
|
+
|
190
|
+
* PostgreSQL Database#transaction method yields a connection, similar
|
191
|
+
to the other adapters.
|
192
|
+
|
193
|
+
* Using a hash argument in #distinct, #order, or #group is treated
|
194
|
+
as an expression instead of a column alias.
|
195
|
+
|
196
|
+
* Cloned datasets no longer ignore the existing columns unless it is
|
197
|
+
necessary.
|
198
|
+
|
199
|
+
* The :quote_identifiers and :single_threaded Database options now
|
200
|
+
work correctly.
|
201
|
+
|
202
|
+
Backwards Incompatible Changes
|
203
|
+
------------------------------
|
204
|
+
|
205
|
+
* ParseTree support, deprecated in 2.1.0, has been removed in 2.2.0.
|
206
|
+
You should use the expression filter syntax instead, perferably
|
207
|
+
without the block (though it can be used inside a block as well).
|
208
|
+
This usually involves the following types of changes:
|
209
|
+
|
210
|
+
filter{:x == :y} => filter(:x => :y)
|
211
|
+
filter{:x << :y} => filter(:x => :y)
|
212
|
+
filter{:x && :y} => filter(:x & :y) # Don't forget about change
|
213
|
+
filter{:x || :y} => filter(:x | :y) # in operator precedence
|
214
|
+
filter{:x.like?('%blah%')} => filter(:x.like('%blah%'))
|
215
|
+
filter do => filter((:x > 1) & (:y < 2))
|
216
|
+
:x > 1
|
217
|
+
:y < 2
|
218
|
+
end
|
219
|
+
|
220
|
+
* Attempts to save an invalid Model instance will raise an error by
|
221
|
+
default. To revert to returning a nil value, use:
|
222
|
+
|
223
|
+
Sequel::Model.raise_on_save_failure = false # Global
|
224
|
+
Album.raise_on_save_failure = false # Class
|
225
|
+
album = Album.new
|
226
|
+
album.raise_on_save_failure = false # Instance
|
227
|
+
|
228
|
+
Note that before, save would return false where now it returns nil
|
229
|
+
if you disable raising on save failure.
|
230
|
+
|
231
|
+
* Dataset#update no longer takes a block, as it's use of the block
|
232
|
+
depended on ParseTree. With the introduction of the expression
|
233
|
+
syntax in 2.0.0, it's no longer necessary. You should use a hash
|
234
|
+
with an expression as the value instead:
|
235
|
+
|
236
|
+
DB[:table].update(:column=>:column + 1)
|
237
|
+
|
238
|
+
* validates_presence of now considers false as present instead of
|
239
|
+
absent. This is so it works with boolean columns.
|
240
|
+
|
241
|
+
* Dataset#graph ignores any previously selected columns when it is
|
242
|
+
called for the first time.
|
243
|
+
|
244
|
+
* Dataset#columns ignores any filtering, ordering, or distinct
|
245
|
+
clauses. This shouldn't cause issues unless you were using
|
246
|
+
SQL functions with side effects and expecting them to be called
|
247
|
+
when columns was called (unlikely at best).
|
248
|
+
|
249
|
+
One significant point of note is that the 2.2.0 release will be the
|
250
|
+
last release with both a sequel_core and sequel gem. Starting
|
251
|
+
with 2.3.0 they will be combined into one sequel gem. You will still
|
252
|
+
be able to get just the sequel_core part by requiring 'sequel_core',
|
253
|
+
but they will be packaged together.
|