sequel 5.6.0 → 5.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +30 -5099
- data/Rakefile +1 -1
- data/doc/opening_databases.rdoc +0 -2
- data/doc/postgresql.rdoc +31 -0
- data/doc/querying.rdoc +2 -2
- data/doc/release_notes/5.7.0.txt +108 -0
- data/doc/testing.rdoc +1 -0
- data/lib/sequel/adapters/jdbc/derby.rb +1 -1
- data/lib/sequel/adapters/jdbc/oracle.rb +11 -0
- data/lib/sequel/adapters/postgres.rb +1 -0
- data/lib/sequel/adapters/shared/postgres.rb +117 -13
- data/lib/sequel/connection_pool/sharded_threaded.rb +7 -6
- data/lib/sequel/connection_pool/threaded.rb +6 -6
- data/lib/sequel/core.rb +20 -0
- data/lib/sequel/database/logging.rb +3 -2
- data/lib/sequel/database/schema_generator.rb +1 -2
- data/lib/sequel/dataset/actions.rb +15 -5
- data/lib/sequel/extensions/connection_expiration.rb +3 -3
- data/lib/sequel/extensions/connection_validator.rb +3 -3
- data/lib/sequel/extensions/integer64.rb +30 -0
- data/lib/sequel/extensions/migration.rb +2 -3
- data/lib/sequel/plugins/pg_array_associations.rb +5 -3
- data/lib/sequel/plugins/validate_associated.rb +18 -0
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/mssql_spec.rb +6 -6
- data/spec/adapters/mysql_spec.rb +1 -1
- data/spec/adapters/oracle_spec.rb +15 -1
- data/spec/adapters/postgres_spec.rb +78 -1
- data/spec/adapters/spec_helper.rb +3 -1
- data/spec/bin_spec.rb +1 -0
- data/spec/core/dataset_spec.rb +10 -0
- data/spec/extensions/integer64_spec.rb +22 -0
- data/spec/extensions/pg_array_associations_spec.rb +14 -2
- data/spec/extensions/spec_helper.rb +1 -0
- data/spec/integration/associations_test.rb +4 -4
- data/spec/integration/dataset_test.rb +2 -0
- data/spec/integration/spec_helper.rb +5 -11
- data/spec/model/spec_helper.rb +1 -0
- metadata +35 -165
- data/doc/release_notes/1.0.txt +0 -38
- data/doc/release_notes/1.1.txt +0 -143
- data/doc/release_notes/1.3.txt +0 -101
- data/doc/release_notes/1.4.0.txt +0 -53
- data/doc/release_notes/1.5.0.txt +0 -155
- data/doc/release_notes/2.0.0.txt +0 -298
- data/doc/release_notes/2.1.0.txt +0 -271
- data/doc/release_notes/2.10.0.txt +0 -328
- data/doc/release_notes/2.11.0.txt +0 -215
- data/doc/release_notes/2.12.0.txt +0 -534
- data/doc/release_notes/2.2.0.txt +0 -253
- data/doc/release_notes/2.3.0.txt +0 -88
- data/doc/release_notes/2.4.0.txt +0 -106
- data/doc/release_notes/2.5.0.txt +0 -137
- data/doc/release_notes/2.6.0.txt +0 -157
- data/doc/release_notes/2.7.0.txt +0 -166
- data/doc/release_notes/2.8.0.txt +0 -171
- data/doc/release_notes/2.9.0.txt +0 -97
- data/doc/release_notes/3.0.0.txt +0 -221
- data/doc/release_notes/3.1.0.txt +0 -406
- data/doc/release_notes/3.10.0.txt +0 -286
- data/doc/release_notes/3.11.0.txt +0 -254
- data/doc/release_notes/3.12.0.txt +0 -304
- data/doc/release_notes/3.13.0.txt +0 -210
- data/doc/release_notes/3.14.0.txt +0 -118
- data/doc/release_notes/3.15.0.txt +0 -78
- data/doc/release_notes/3.16.0.txt +0 -45
- data/doc/release_notes/3.17.0.txt +0 -58
- data/doc/release_notes/3.18.0.txt +0 -120
- data/doc/release_notes/3.19.0.txt +0 -67
- data/doc/release_notes/3.2.0.txt +0 -268
- data/doc/release_notes/3.20.0.txt +0 -41
- data/doc/release_notes/3.21.0.txt +0 -87
- data/doc/release_notes/3.22.0.txt +0 -39
- data/doc/release_notes/3.23.0.txt +0 -172
- data/doc/release_notes/3.24.0.txt +0 -420
- data/doc/release_notes/3.25.0.txt +0 -88
- data/doc/release_notes/3.26.0.txt +0 -88
- data/doc/release_notes/3.27.0.txt +0 -82
- data/doc/release_notes/3.28.0.txt +0 -304
- data/doc/release_notes/3.29.0.txt +0 -459
- data/doc/release_notes/3.3.0.txt +0 -192
- data/doc/release_notes/3.30.0.txt +0 -135
- data/doc/release_notes/3.31.0.txt +0 -146
- data/doc/release_notes/3.32.0.txt +0 -202
- data/doc/release_notes/3.33.0.txt +0 -157
- data/doc/release_notes/3.34.0.txt +0 -671
- data/doc/release_notes/3.35.0.txt +0 -144
- data/doc/release_notes/3.36.0.txt +0 -245
- data/doc/release_notes/3.37.0.txt +0 -338
- data/doc/release_notes/3.38.0.txt +0 -234
- data/doc/release_notes/3.39.0.txt +0 -237
- data/doc/release_notes/3.4.0.txt +0 -325
- data/doc/release_notes/3.40.0.txt +0 -73
- data/doc/release_notes/3.41.0.txt +0 -155
- data/doc/release_notes/3.42.0.txt +0 -74
- data/doc/release_notes/3.43.0.txt +0 -105
- data/doc/release_notes/3.44.0.txt +0 -152
- data/doc/release_notes/3.45.0.txt +0 -179
- data/doc/release_notes/3.46.0.txt +0 -122
- data/doc/release_notes/3.47.0.txt +0 -270
- data/doc/release_notes/3.48.0.txt +0 -477
- data/doc/release_notes/3.5.0.txt +0 -510
- data/doc/release_notes/3.6.0.txt +0 -366
- data/doc/release_notes/3.7.0.txt +0 -179
- data/doc/release_notes/3.8.0.txt +0 -151
- data/doc/release_notes/3.9.0.txt +0 -233
@@ -1,304 +0,0 @@
|
|
1
|
-
= Migration Changes
|
2
|
-
|
3
|
-
* A TimestampMigrator has been added to Sequel, and is
|
4
|
-
automatically used if any migration has a version greater than
|
5
|
-
20000100. This migrator operates similarly to the default
|
6
|
-
ActiveRecord migrator, in that it allows missing migrations.
|
7
|
-
It differs from the ActiveRecord migrator in that it supports
|
8
|
-
migrations with the same timestamp/version as well as a wide
|
9
|
-
variety of timestamp formats (though the ActiveRecord default
|
10
|
-
of YYYYMMDDHHMMSS is recommended and should be used in
|
11
|
-
portable code).
|
12
|
-
|
13
|
-
Sequel still defaults to the old migrator, but you can use the
|
14
|
-
new one without making changes to your old migrations. Just
|
15
|
-
make sure your new migration starts with a version greater than
|
16
|
-
20000100, and Sequel will automatically convert the previous
|
17
|
-
schema table to the new format.
|
18
|
-
|
19
|
-
* A new migration DSL was added:
|
20
|
-
|
21
|
-
Sequel.migration do
|
22
|
-
up do
|
23
|
-
end
|
24
|
-
|
25
|
-
down do
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
The old style of using a Sequel::Migration subclass is still
|
30
|
-
supported, but it is recommended that new code use the new DSL.
|
31
|
-
|
32
|
-
* The default migrator also had significant issues fixed. First,
|
33
|
-
it now saves the migration version after each migration, instead
|
34
|
-
of after all migrations, which means Sequel won't attempt to
|
35
|
-
apply already applied migrations if there was previously an error
|
36
|
-
when applying multiple migrations at once on a database that
|
37
|
-
didn't support transactional schema modification.
|
38
|
-
|
39
|
-
Second, duplicate migration versions in the default migrator now
|
40
|
-
raise an exception, as do missing migration versions. Neither
|
41
|
-
should happen when using the default migrator, which requires
|
42
|
-
consecutive integer versions, similar to the old ActiveRecord
|
43
|
-
migrator.
|
44
|
-
|
45
|
-
* Execution times for migrations are now logged to the database's
|
46
|
-
loggers.
|
47
|
-
|
48
|
-
= New Plugins
|
49
|
-
|
50
|
-
* A sharding plugin has been added that allows model objects to
|
51
|
-
work well with sharded databases. When using it, model objects
|
52
|
-
know which shard they were retrieved from, so when you save
|
53
|
-
the object, it is saved back to that shard. The sharding plugin
|
54
|
-
also works with associations, so associated records are retrieved
|
55
|
-
from the same shard the main object was retreived from. The
|
56
|
-
sharding plugin also works with both methods of eager loading, and
|
57
|
-
provides methods that you can use to create objects on specific
|
58
|
-
shards.
|
59
|
-
|
60
|
-
* An update_primary_key plugin has been added that allows Sequel
|
61
|
-
to work correctly if you modify the primary key of a model object.
|
62
|
-
This should not be necessary if you are using surrogate keys, but
|
63
|
-
if your database uses natural primary keys which can change, this
|
64
|
-
should be helpful.
|
65
|
-
|
66
|
-
* An association_pks plugin has been added that adds association_pks
|
67
|
-
and association_pks= methods to model objects for both one_to_many
|
68
|
-
and many_to_many associations. The association_pks method returns
|
69
|
-
an array of primary key values for the associated objects, and
|
70
|
-
the association_pks= method modifies the database to ensure that
|
71
|
-
the object is only associated to the objects specified by the
|
72
|
-
array of primary keys provided to it.
|
73
|
-
|
74
|
-
* A string_stripper plugin has been added that strips all strings
|
75
|
-
that are assigned to attribute values. This is useful for web
|
76
|
-
applications where you want to easily remove leading and trailing
|
77
|
-
whitespace in form entries before storing them in the database.
|
78
|
-
|
79
|
-
* A skip_create_refresh plugin has been added that skips the refresh
|
80
|
-
of after you save a new model object. On most databases, Sequel
|
81
|
-
refreshes the model object after inserting it in order to get
|
82
|
-
values for all of the columns. For performance reasons, you can
|
83
|
-
use this plugin to skip the refresh if it isn't necessary for you.
|
84
|
-
|
85
|
-
= Other New Features
|
86
|
-
|
87
|
-
* Sequel::Model#set_fields and update_fields were added. These
|
88
|
-
methods have a similar API to set_only and update_only, but they
|
89
|
-
operate differently. While set_only and update_only operate over
|
90
|
-
the hash, these methods operate over the array of fields,
|
91
|
-
so they don't raise errors if the hash contains fields not
|
92
|
-
in the array:
|
93
|
-
|
94
|
-
params = {:a=>1, :b=>2, :c=>3}
|
95
|
-
album = Album[1]
|
96
|
-
|
97
|
-
# raises Error because :a is not in the fields
|
98
|
-
album.set_only(params, [:b, :c])
|
99
|
-
|
100
|
-
# Just sets the value of album.b and album.c
|
101
|
-
album.set_fields(params, [:b, :c])
|
102
|
-
|
103
|
-
Other than handling entries in the hash that aren't in the array,
|
104
|
-
set_fields and update_fields also handle entries not in the hash
|
105
|
-
differently:
|
106
|
-
|
107
|
-
# Doesn't modify the object, since the hash is empty
|
108
|
-
album.set_only({}, [:b, :c])
|
109
|
-
|
110
|
-
# Sets album.b and album.c to nil, since they aren't in the hash
|
111
|
-
album.set_fields({}, [:b, :c])
|
112
|
-
|
113
|
-
* The :eager_loader association option has a new API, though the
|
114
|
-
previous API still works. Instead of accepting three arguments,
|
115
|
-
it can now accept a single hash argument, which will use the
|
116
|
-
:key_hash, :rows, and :association keys for the previous three
|
117
|
-
arguments. The hash will also contain a :self key whose value
|
118
|
-
is the dataset doing the eager load, which was not possible to
|
119
|
-
determine using the old API.
|
120
|
-
|
121
|
-
* Sequel::SQL::Expression#hash has been added so that the objects
|
122
|
-
are now safe to use as hash keys.
|
123
|
-
|
124
|
-
* A Dataset#order_prepend method has been added allowing you to
|
125
|
-
prepend to an existing order. This is useful if want to modify
|
126
|
-
a dataset's order such that it first orders by the columns you
|
127
|
-
provide, but for any rows where the columns you provide are
|
128
|
-
equal, uses the existing order to further order the dataset:
|
129
|
-
|
130
|
-
ds.order(:albums__name).order_prepend(:artists__name)
|
131
|
-
# ORDER BY artists.name, albums.name
|
132
|
-
|
133
|
-
* When creating foreign key columns, you can now use a :deferrable
|
134
|
-
option to set up a foreign key constraint that is not checked
|
135
|
-
until the end of the transaction:
|
136
|
-
|
137
|
-
DB.create_table(:albums) do
|
138
|
-
primary_key :id
|
139
|
-
String :name
|
140
|
-
foreign_key :artist_id, :artists, :deferrable=>true
|
141
|
-
end
|
142
|
-
|
143
|
-
* many_to_many associations now support a :join_table_block option
|
144
|
-
that is used by the add/remove/remove_all methods. It can modify
|
145
|
-
the dataset to ensure that certain columns are included when
|
146
|
-
inserting or to add a filter so that only certain records are
|
147
|
-
deleted. It's useful if you have a many_to_many association that
|
148
|
-
is filtered to only a subset of the matching rows in the join
|
149
|
-
table.
|
150
|
-
|
151
|
-
* The single_table_inheritance plugin now supports :model_map and
|
152
|
-
:key_map options to set up a custom mapping of column values to
|
153
|
-
model classes. For simple situations such as when you are mapping
|
154
|
-
integer values to certain classes, a :model_map hash is sufficient:
|
155
|
-
|
156
|
-
Employee.plugin :single_table_inheritance, :type_id,
|
157
|
-
:model_map=>{1=>:Staff, 2=>:Manager}
|
158
|
-
|
159
|
-
Here the :model_map keys are type_id column values, and the
|
160
|
-
:model_map values are symbols or strings specifying class names.
|
161
|
-
|
162
|
-
For more complex conditions, you can use a pair of procs:
|
163
|
-
|
164
|
-
Employee.plugin :single_table_inheritance, :type_name,
|
165
|
-
:model_map=>proc{|v| v.reverse},
|
166
|
-
:key_map=>proc{|klass| klass.name.reverse}
|
167
|
-
|
168
|
-
Here the type_name column is a string column holding the reverse
|
169
|
-
of the class's name.
|
170
|
-
|
171
|
-
* The single_table_inheritance plugin now correctly sets up subclass
|
172
|
-
filters for middle tables in a class hierarchy with more than 2
|
173
|
-
levels. For example, with this code:
|
174
|
-
|
175
|
-
class Employee < Sequel::Model; end
|
176
|
-
Employee.plugin :single_table_inheritance, :kind
|
177
|
-
class Manager < Employee; end
|
178
|
-
class Executive < Manager; end
|
179
|
-
|
180
|
-
Sequel previously would not return Executives if you used
|
181
|
-
Manager.all. It now correctly recognizes subclasses so that it
|
182
|
-
will return both Managers and Executives.
|
183
|
-
|
184
|
-
* Sequel::Model.qualified_primary_key_hash has been added, giving
|
185
|
-
you a hash that can be used for filtering. It is similar to
|
186
|
-
primary_key_hash, but it qualifies the keys with the model's
|
187
|
-
table. It's useful if you have joined the table to another table
|
188
|
-
that has columns with the same name, but you want to only look
|
189
|
-
for a single model object in that dataset.
|
190
|
-
|
191
|
-
* For consistency, you can now use Dataset#order_append as an alias
|
192
|
-
for order_more.
|
193
|
-
|
194
|
-
= Other Improvements
|
195
|
-
|
196
|
-
* Sequel now correctly removes schema entries when altering tables.
|
197
|
-
Previously, some adapters that had to query the existing schema
|
198
|
-
when altering tables resulted in the previous schema being cached.
|
199
|
-
|
200
|
-
* Sequel::Model::Errors#on now always returns nil if there are no
|
201
|
-
errors on the attribute. Previously, it would return an empty
|
202
|
-
array in certain cases. Additionally, Sequel::Model::Errors#empty?
|
203
|
-
now returns true if there are no errors, where it certain cases
|
204
|
-
it would return false even if there were no errors.
|
205
|
-
|
206
|
-
* The schema_dumper extension now works with tables specified as
|
207
|
-
Sequel::SQL::Identifiers.
|
208
|
-
|
209
|
-
* Sequel now recognizes the timestamp(N) with(out) time zone column
|
210
|
-
type.
|
211
|
-
|
212
|
-
* The lazy_attributes plugin no longer requires the core extensions
|
213
|
-
to work correctly.
|
214
|
-
|
215
|
-
* DatabaseDisconnectError support has been added to the ODBC adapter,
|
216
|
-
allowing Sequel to detect disconnects and remove the connection
|
217
|
-
from the connection pool.
|
218
|
-
|
219
|
-
* A leak of JDBC statement objects when using transactions was
|
220
|
-
fixed in the jdbc adapter.
|
221
|
-
|
222
|
-
* The jdbc adapter now gives a nicer error message if you use a
|
223
|
-
connection string that it doesn't recognize and there is an error
|
224
|
-
when connecting.
|
225
|
-
|
226
|
-
* Temporary table creation was fixed on Microsoft SQL Server, but
|
227
|
-
it is not recommended as it changes the name of the table. If
|
228
|
-
you use Microsoft SQL Server, you should prefix your temporary
|
229
|
-
table names with # and use the regular create table method.
|
230
|
-
|
231
|
-
* A large number of guides were added to Sequel to make it easier
|
232
|
-
for new and existing users to learn more about Sequel. The
|
233
|
-
following guides were added:
|
234
|
-
|
235
|
-
* Querying in Sequel
|
236
|
-
* Migration and Schema Modification
|
237
|
-
* Model Hooks
|
238
|
-
* Model Validations
|
239
|
-
* Sequel for SQL Users
|
240
|
-
* Sequel for ActiveRecord Users
|
241
|
-
|
242
|
-
* RDoc section support was added to Sequel::Database, making the
|
243
|
-
method documentation easier to read.
|
244
|
-
|
245
|
-
= Backwards Compatibility
|
246
|
-
|
247
|
-
* Sequel::Database now defines the indexes and tables methods, even
|
248
|
-
if the adapter does not implement them, similar to how connect
|
249
|
-
and execute are defined. Previously, you could use respond_to? to
|
250
|
-
check if the adapter supported them, now they raise
|
251
|
-
Sequel::NotImplemented if the database adapter does not implement
|
252
|
-
them.
|
253
|
-
|
254
|
-
* Sequel used to raise NotImplementedError in certain default
|
255
|
-
definitions of methods inside Sequel::Database and Sequel::Dataset,
|
256
|
-
when the methods were supposed to be overridden in subclasses.
|
257
|
-
Sequel now uses a Sequel::NotImplemented exception class for these
|
258
|
-
exceptions, which is a subclass of Sequel::Error.
|
259
|
-
|
260
|
-
* Sequel no longer applies all association options to the dataset
|
261
|
-
used to remove all many_to_many associated objects. You should
|
262
|
-
use the new :join_table_block option to get similar behavior if
|
263
|
-
you were filtering the many_to_many association based on columns
|
264
|
-
in the join table and you wanted remove_all to only remove the
|
265
|
-
related columns.
|
266
|
-
|
267
|
-
* Sequel now calls certain before and after hook actions in plugins
|
268
|
-
in a different order than before. This should not have an effect
|
269
|
-
unless you were relying on them being called in the previous order.
|
270
|
-
Now, when overriding before hooks in plugins, Sequel always does
|
271
|
-
actions before calling super, and when overriding after hooks in
|
272
|
-
plugins, Sequel always does actions after calling super.
|
273
|
-
|
274
|
-
* The hook_class_methods plugin no longer skips later after hooks if
|
275
|
-
a previous after hook returns false. That behavior now only occurs
|
276
|
-
for before hooks.
|
277
|
-
|
278
|
-
* Sequel now only removes primary key values when updating objects if
|
279
|
-
you are saving the entire object and you have not modified the
|
280
|
-
values of the primary keys. Previously, Sequel would remove
|
281
|
-
primary key values when updating even if you specified the primary
|
282
|
-
key column specifically or the primary key column was modified and
|
283
|
-
you used save_changes/update.
|
284
|
-
|
285
|
-
* Sequel now uses explicit methods instead of aliases for certain
|
286
|
-
methods. This should only affect you if for example you overrode
|
287
|
-
Dataset#group to do one thing and wanted Dataset#group_by to do
|
288
|
-
the default action. Now, Dataset#group_by, and methods like it, are
|
289
|
-
explicit methods that just call the methods they previously
|
290
|
-
aliased. This also means that if you were overriding Dataset#group
|
291
|
-
and explicitly aliasing group_by to it, you no longer need the
|
292
|
-
alias.
|
293
|
-
|
294
|
-
* The single_table_inheritance plugin now uses IN instead of = for
|
295
|
-
subclass filters. This could lead to poor performance if the
|
296
|
-
database has a very bad query planner.
|
297
|
-
|
298
|
-
* The private transaction_statement_object method was removed from
|
299
|
-
the JDBC adapter, and Sequel will no longer check for the presence
|
300
|
-
of the method in the transaction code.
|
301
|
-
|
302
|
-
* The Sequel::Migrator object is now a class instead of a module, and
|
303
|
-
has been pretty much rewritten. If you were using any methods of
|
304
|
-
it besides apply and run, they no longer work.
|
@@ -1,210 +0,0 @@
|
|
1
|
-
= New Plugins
|
2
|
-
|
3
|
-
* A json_serializer plugin was added that allows you to serialize
|
4
|
-
model instances or datasets to JSON using to_json. It requires
|
5
|
-
the json library. The API was modeled on ActiveRecord's JSON
|
6
|
-
serialization support. You can use :only and :except options
|
7
|
-
to specify the columns included, :include to specify associations
|
8
|
-
to include, as well pass options to nested associations using a
|
9
|
-
hash. In addition to serializing to JSON, it also adds support
|
10
|
-
for parsing JSON to model objects via JSON.parse or #from_json.
|
11
|
-
|
12
|
-
* An xml_serializer plugin was added that allows you to serialize
|
13
|
-
model instances or datasets to XML. It requries the nokogiri
|
14
|
-
library. It has a similar API to the json_serializer plugin, using
|
15
|
-
to_xml instead of to_json, and the from_xml class method instead
|
16
|
-
of JSON.parse.
|
17
|
-
|
18
|
-
* A tree plugin was added that allows you to treat Sequel::Model
|
19
|
-
objects as being part of a tree. It provides similar features to
|
20
|
-
rcte_tree, but works on databases that don't support recursive
|
21
|
-
common table expressions. In addition to the standard parent
|
22
|
-
and children associations, it provides instance methods to get
|
23
|
-
the ancestors, descendants, and siblings of the given tree node,
|
24
|
-
and class methods to get the roots of the tree.
|
25
|
-
|
26
|
-
* A list plugin was added that allows you to treat Sequel::Model
|
27
|
-
objects as being part of a list. This adds instance methods to
|
28
|
-
get the next and prev items in the list, or to move the item
|
29
|
-
to a specific place in the list. You can specify that all rows
|
30
|
-
in the table belong to the same list, or specify arbitrary scopes
|
31
|
-
so that the same table can contain many separate lists.
|
32
|
-
|
33
|
-
= Other New Features
|
34
|
-
|
35
|
-
* Sequel is now compatible with Ruby 1.9.2pre3.
|
36
|
-
|
37
|
-
* Sequel now supports prepared transactions/two-phase commit on
|
38
|
-
PostgreSQL, MySQL, and H2. You can specify that you want to
|
39
|
-
use prepared transactions using the :prepare option which
|
40
|
-
should be some transaction id string:
|
41
|
-
|
42
|
-
DB.transaction(:prepare=>'some string') do ... end
|
43
|
-
|
44
|
-
Assuming that no exceptions are raised in the transaction block,
|
45
|
-
Sequel will prepare the transaction. You can then commit the
|
46
|
-
transaction later:
|
47
|
-
|
48
|
-
DB.commit_prepared_transaction('some string')
|
49
|
-
|
50
|
-
If you need to rollback the prepared transaction, you can do
|
51
|
-
so as well:
|
52
|
-
|
53
|
-
DB.rollback_prepared_transaction('some string')
|
54
|
-
|
55
|
-
* Sequel now supports customizable transaction isolation levels on
|
56
|
-
PostgreSQL, MySQL, and Microsoft SQL Server. You can specify the
|
57
|
-
transaction isolation level to use for any transaction using the
|
58
|
-
:isolation option with an :uncommitted, :committed, :repeatable,
|
59
|
-
or :serializable value:
|
60
|
-
|
61
|
-
DB.transaction(:isolation=>:serializable) do ... end
|
62
|
-
|
63
|
-
You can also set the default isolation level for transactions via
|
64
|
-
the transaction_isolation_level Database attribute:
|
65
|
-
|
66
|
-
DB.transaction_isolation_level = :committed
|
67
|
-
|
68
|
-
If you are connecting to Microsoft SQL Server, it is recommended
|
69
|
-
that you set a default transaction isolation level if you plan
|
70
|
-
on using this feature.
|
71
|
-
|
72
|
-
* You can specify a NULLS FIRST/LAST ordering by using the
|
73
|
-
:nulls=>:first/:last option to asc and desc:
|
74
|
-
|
75
|
-
Album.filter(:release_date.desc(:nulls=>:first),
|
76
|
-
:name.asc(:nulls=>:last))
|
77
|
-
# ORDER BY release_date DESC NULLS FIRST,
|
78
|
-
# name ASC NULLS LAST
|
79
|
-
|
80
|
-
This syntax is supported by PostgreSQL 8.3+, Firebird 1.5+,
|
81
|
-
Oracle, and probably some other databases as well, and makes it
|
82
|
-
possible for the user to specify whether NULL values should sort
|
83
|
-
before or after other values.
|
84
|
-
|
85
|
-
* Sequel::Model.find_or_create now accepts a block that is a yielded
|
86
|
-
a new model object to be created if an existing model object is
|
87
|
-
not found.
|
88
|
-
|
89
|
-
Node.find_or_create(:name=>'A'){|i| i.parent_id = 4}
|
90
|
-
|
91
|
-
* The :frame option for windows and window functions can now be a
|
92
|
-
string that is used literally in the SQL. This is necessary if you
|
93
|
-
want to specify a custom frame, such as one that uses a specific
|
94
|
-
number of rows preceding or following.
|
95
|
-
|
96
|
-
* Savepoints are now supported on H2.
|
97
|
-
|
98
|
-
* A :methods_module association option was added, allowing you to
|
99
|
-
specify the module into which association instance methods are
|
100
|
-
placed. By default, it uses the module containing the column
|
101
|
-
accessor methods.
|
102
|
-
|
103
|
-
= Other Improvements
|
104
|
-
|
105
|
-
* The :encoding option for the native MySQL adapter should now work
|
106
|
-
correctly in all cases. This fix was included in 3.12.1.
|
107
|
-
|
108
|
-
* Sequel now handles arrays of two element arrays automatically when
|
109
|
-
using them as the value of a filter hash:
|
110
|
-
|
111
|
-
DB[a].filter([:a, :b]=>[[1, 2], [3, 4]])
|
112
|
-
|
113
|
-
Previously, you had to call .sql_array on the array in order to
|
114
|
-
tell Sequel that it was a value list and not a conditions
|
115
|
-
specifier.
|
116
|
-
|
117
|
-
* Sequel no longer attempts to use class polymorphism in the
|
118
|
-
class_table_inheritance plugin if you don't specify a cti_key.
|
119
|
-
|
120
|
-
* When using the native SQLite adapter, prepared statements are now
|
121
|
-
cached per connection for increased performance. Previously,
|
122
|
-
Sequel prepared a new statement for every query.
|
123
|
-
|
124
|
-
* tinyint(1) columns are now handled as booleans when connecting to
|
125
|
-
MySQL via JDBC.
|
126
|
-
|
127
|
-
* On PostgreSQL, if no :schema option is provided for
|
128
|
-
Database#tables, #table_exists?, or #schema, and no default_schema
|
129
|
-
is used, assume all schemas except the default non-public ones.
|
130
|
-
Previously, it assumed the public schema for tables and
|
131
|
-
table_exists?, but did not assume any schema for #schema.
|
132
|
-
|
133
|
-
This fixes issues if you use table names that overlap with table
|
134
|
-
names in the information_schema, such as domains. It's still
|
135
|
-
recommended that you specify a default_schema if you are using a
|
136
|
-
schema other than public.
|
137
|
-
|
138
|
-
* Unsigned integers are now handled correctly in the schema dumper.
|
139
|
-
|
140
|
-
* Sequel::SQL::PlaceholderLiteralString is now a GenericExpression
|
141
|
-
subclass, allowing you to treat it like most other Sequel
|
142
|
-
expression objects:
|
143
|
-
|
144
|
-
'(a || ?)'.lit(:b).like('Test%')
|
145
|
-
# ((a || b) LIKE 'Test%')
|
146
|
-
|
147
|
-
* Sequel now supports the bitwise shift operators (<< and >>) on
|
148
|
-
Microsoft SQL Server by emulating them.
|
149
|
-
|
150
|
-
* Sequel now supports most bitwise operators (&, |, ^, <<, >>) on H2
|
151
|
-
by emulating them. The bitwise complement operator is not yet
|
152
|
-
supported.
|
153
|
-
|
154
|
-
* Sequel now logs the SQL queries that are sent when connecting to
|
155
|
-
MySQL.
|
156
|
-
|
157
|
-
* If a plugin cannot be loaded, Sequel now gives a more detailed
|
158
|
-
error message.
|
159
|
-
|
160
|
-
= Backwards Compatibility
|
161
|
-
|
162
|
-
* Array#sql_array and the Sequel::SQL::SQLArray class are now
|
163
|
-
considered deprecated. Use the Array#sql_value_list and the
|
164
|
-
Sequel::SQL::ValueList class instead. SQLArray is now just
|
165
|
-
an alias for ValueList, but it now is an Array subclass instead
|
166
|
-
of a Sequel::SQL::Expression subclass.
|
167
|
-
|
168
|
-
* Using the ruby bitwise xor operator (^) on PostgreSQL now uses
|
169
|
-
PostgreSQL's bitwise xor operator (#) instead of PostgreSQL's
|
170
|
-
exponentiation operator (^). If you want exponentiation, use
|
171
|
-
the power function.
|
172
|
-
|
173
|
-
* Using the ruby bitwise complement operator (~) on MySQL now returns
|
174
|
-
a signed integer instead of an unsigned integer, for better
|
175
|
-
compatibility with other databases.
|
176
|
-
|
177
|
-
* Using nil as a case expression value (the 2nd argument to Hash#case
|
178
|
-
and Array#case) will now use NULL as the case expression value,
|
179
|
-
instead of omitting the case expression value:
|
180
|
-
|
181
|
-
# 3.12.0
|
182
|
-
{1=>2}.case(0, nil)
|
183
|
-
# CASE WHEN 1 THEN 2 ELSE 0 END
|
184
|
-
|
185
|
-
# 3.13.0
|
186
|
-
{1=>2}.case(0, nil)
|
187
|
-
# CASE NULL WHEN 1 THEN 2 ELSE 0 END
|
188
|
-
|
189
|
-
In general, you would never use nil explicitly, but the new
|
190
|
-
behavior makes more sense if you have a variable that might be nil:
|
191
|
-
|
192
|
-
parent_id = Node[1].parent_id
|
193
|
-
{1=>2}.case(0, parent_id)
|
194
|
-
|
195
|
-
If parent_id IS NULL/nil, then previously Sequel would have
|
196
|
-
generated unexpected SQL. If you don't want a case expression
|
197
|
-
value to be used, do not pass a second argument to #case.
|
198
|
-
|
199
|
-
* Some internal transaction methods now take an optional options
|
200
|
-
hash, so if you have a custom adapter, you will need to make
|
201
|
-
changes.
|
202
|
-
|
203
|
-
* Some internal association methods now take an optional options
|
204
|
-
hash.
|
205
|
-
|
206
|
-
* Some Rakefile task names were modified in the name of consistency:
|
207
|
-
|
208
|
-
spec_coverage -> spec_cov
|
209
|
-
integration -> spec_integration
|
210
|
-
integration_cov -> spec_integration_cov
|