sequel 3.27.0 → 3.28.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +96 -0
- data/README.rdoc +2 -2
- data/Rakefile +1 -1
- data/doc/association_basics.rdoc +48 -0
- data/doc/opening_databases.rdoc +29 -5
- data/doc/prepared_statements.rdoc +1 -0
- data/doc/release_notes/3.28.0.txt +304 -0
- data/doc/testing.rdoc +42 -0
- data/doc/transactions.rdoc +97 -0
- data/lib/sequel/adapters/db2.rb +95 -65
- data/lib/sequel/adapters/firebird.rb +25 -219
- data/lib/sequel/adapters/ibmdb.rb +440 -0
- data/lib/sequel/adapters/jdbc.rb +12 -0
- data/lib/sequel/adapters/jdbc/as400.rb +0 -7
- data/lib/sequel/adapters/jdbc/db2.rb +49 -0
- data/lib/sequel/adapters/jdbc/firebird.rb +34 -0
- data/lib/sequel/adapters/jdbc/oracle.rb +2 -27
- data/lib/sequel/adapters/jdbc/transactions.rb +34 -0
- data/lib/sequel/adapters/mysql.rb +10 -15
- data/lib/sequel/adapters/odbc.rb +1 -2
- data/lib/sequel/adapters/odbc/db2.rb +5 -5
- data/lib/sequel/adapters/postgres.rb +71 -11
- data/lib/sequel/adapters/shared/db2.rb +290 -0
- data/lib/sequel/adapters/shared/firebird.rb +214 -0
- data/lib/sequel/adapters/shared/mssql.rb +18 -75
- data/lib/sequel/adapters/shared/mysql.rb +13 -0
- data/lib/sequel/adapters/shared/postgres.rb +52 -36
- data/lib/sequel/adapters/shared/sqlite.rb +32 -36
- data/lib/sequel/adapters/sqlite.rb +4 -8
- data/lib/sequel/adapters/tinytds.rb +7 -3
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +55 -0
- data/lib/sequel/core.rb +1 -1
- data/lib/sequel/database/connecting.rb +1 -1
- data/lib/sequel/database/misc.rb +6 -5
- data/lib/sequel/database/query.rb +1 -1
- data/lib/sequel/database/schema_generator.rb +2 -1
- data/lib/sequel/dataset/actions.rb +149 -33
- data/lib/sequel/dataset/features.rb +44 -7
- data/lib/sequel/dataset/misc.rb +9 -1
- data/lib/sequel/dataset/prepared_statements.rb +2 -2
- data/lib/sequel/dataset/query.rb +63 -10
- data/lib/sequel/dataset/sql.rb +22 -5
- data/lib/sequel/model.rb +3 -3
- data/lib/sequel/model/associations.rb +250 -27
- data/lib/sequel/model/base.rb +10 -16
- data/lib/sequel/plugins/many_through_many.rb +34 -2
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +1 -1
- data/lib/sequel/sql.rb +94 -51
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/db2_spec.rb +146 -0
- data/spec/adapters/postgres_spec.rb +74 -6
- data/spec/adapters/spec_helper.rb +1 -0
- data/spec/adapters/sqlite_spec.rb +11 -0
- data/spec/core/database_spec.rb +7 -0
- data/spec/core/dataset_spec.rb +180 -17
- data/spec/core/expression_filters_spec.rb +107 -41
- data/spec/core/spec_helper.rb +11 -0
- data/spec/extensions/many_through_many_spec.rb +115 -1
- data/spec/extensions/prepared_statements_with_pk_spec.rb +3 -3
- data/spec/integration/associations_test.rb +193 -15
- data/spec/integration/database_test.rb +4 -2
- data/spec/integration/dataset_test.rb +215 -19
- data/spec/integration/plugin_test.rb +8 -5
- data/spec/integration/prepared_statement_test.rb +91 -98
- data/spec/integration/schema_test.rb +27 -11
- data/spec/integration/spec_helper.rb +10 -0
- data/spec/integration/type_test.rb +2 -2
- data/spec/model/association_reflection_spec.rb +91 -0
- data/spec/model/associations_spec.rb +13 -0
- data/spec/model/base_spec.rb +8 -21
- data/spec/model/eager_loading_spec.rb +243 -9
- data/spec/model/model_spec.rb +15 -2
- metadata +16 -4
data/CHANGELOG
CHANGED
@@ -1,3 +1,99 @@
|
|
1
|
+
=== 3.28.0 (2011-10-03)
|
2
|
+
|
3
|
+
* Add firebird jdbc subadapter (jeremyevans)
|
4
|
+
|
5
|
+
* Add SQLTime.create method for easier creation of SQLTime instances (jeremyevans)
|
6
|
+
|
7
|
+
* Make Dataset#with_pk use a qualified primary key, so it works correctly on joined datasets (jeremyevans)
|
8
|
+
|
9
|
+
* Support the :limit association option when using eager_graph (jeremyevans)
|
10
|
+
|
11
|
+
* Fix eager loading via eager_graph of one_to_one associations that match multiple associated objects and use order to pick the first one (jeremyevans)
|
12
|
+
|
13
|
+
* Make after_load association hooks apply when using eager_graph (jeremyevans)
|
14
|
+
|
15
|
+
* Make Dataset#with_sql treat a symbol as a first argument as a method name to call to get the SQL (jeremyevans)
|
16
|
+
|
17
|
+
* Make Dataset #delete, #insert, #update return array of plain hashes if block not given and Dataset#returning is used (jeremyevans)
|
18
|
+
|
19
|
+
* Allow Dataset #map, #to_hash, #select_map, #select_order_map, and #select_hash to take arrays of columns instead of single columns (jeremyevans)
|
20
|
+
|
21
|
+
* Make Dataset #delete, #insert, #update yield plain hashes to a block if Dataset#returning is used (jeremyevans)
|
22
|
+
|
23
|
+
* Add Dataset#returning for setting the columns to return in INSERT/UPDATE/DELETE statements, used by PostgreSQL 9.1 (jeremyevans)
|
24
|
+
|
25
|
+
* Support WITH clause in INSERT/UPDATE/DELETE on PostgreSQL 9.1+ (jeremyevans)
|
26
|
+
|
27
|
+
* Add Database#copy_table for PostgreSQL COPY support when using the postgres adapter with pg (jeremyevans)
|
28
|
+
|
29
|
+
* Support CREATE TABLE IF NOT EXISTS on PostgreSQL 9.1+ (jeremyevans)
|
30
|
+
|
31
|
+
* Add support for Sequel::Model.default_eager_limit_strategy to set the default :eager_limit_strategy for *_many associations (jeremyevans)
|
32
|
+
|
33
|
+
* Add support for an :eager_limit_strategy => :correlated_subquery value for limiting using correlated subqueries (jeremyevans)
|
34
|
+
|
35
|
+
* Allow use of a dataset that uses the emulated offset support on MSSQL and DB2 in an IN subquery by using a nested subquery (jeremyevans)
|
36
|
+
|
37
|
+
* Allow use of a dataset that uses LIMIT in an IN subquery on MySQL by using a nested subquery (jeremyevans)
|
38
|
+
|
39
|
+
* Work around serious ActiveSupport bug in Time.=== that breaks literalization of Time values (jeremyevans)
|
40
|
+
|
41
|
+
* Speed up SQL operator methods by using module_eval instead of define_method (jeremyevans)
|
42
|
+
|
43
|
+
* Support sql_(boolean,number,string) methods on ComplexExpressions, allowing you do to (x + 1).sql_string + 'a' for (x + 1) || 'a' (jeremyevans)
|
44
|
+
|
45
|
+
* Don't disallow SQL expression creation based on types, leave that to the database server (jeremyevans)
|
46
|
+
|
47
|
+
* Make :column [&|] 1 use an SQL bitwise [&|] expression instead of a logical (AND|OR) expression (jeremyevans)
|
48
|
+
|
49
|
+
* Make :column + 'a' use an SQL string concatenation expression instead of an addition expression (jeremyevans)
|
50
|
+
|
51
|
+
* Fix :time typecasting from Time to SQLTime for fractional seconds on ruby 1.9 (jeremyevans)
|
52
|
+
|
53
|
+
* Have Dataset#select_append check supports_select_all_and_column? and select all from all FROM and JOIN tables if no columns selected (jeremyevans)
|
54
|
+
|
55
|
+
* Add Dataset#supports_select_all_and_column? for checking if you can do SELECT *, column (jeremyevans)
|
56
|
+
|
57
|
+
* Add support for an :eager_limit_strategy => :window_function value for limiting using window functions (jeremyevans)
|
58
|
+
|
59
|
+
* Add support for an :eager_limit_strategy => :distinct_on value for one_to_one associations for using DISTINCT ON (jeremyevans)
|
60
|
+
|
61
|
+
* Add support for an :eager_limit_strategy association option, for manual control over how limiting is done (jeremyevans)
|
62
|
+
|
63
|
+
* Add Dataset#supports_ordered_distinct_on? for checking if the dataset can use distinct on while respecting order (jeremyevans)
|
64
|
+
|
65
|
+
* Add support for the association :limit option when eager loading via .eager for *_many associations (jeremyevans)
|
66
|
+
|
67
|
+
* Add db2 jdbc subadapter (jeremyevans)
|
68
|
+
|
69
|
+
* Fix the db2 adapter so it actually works (jeremyevans)
|
70
|
+
|
71
|
+
* Add ibmdb adapter for accessing DB2 (roylez, jeremyevans)
|
72
|
+
|
73
|
+
* Add much better support for DB2 databases (roylez, jeremyevans)
|
74
|
+
|
75
|
+
* Handle SQL::AliasedExpressions and SQL::JoinClauses in Dataset#select_all (jeremyevans)
|
76
|
+
|
77
|
+
* Speed up type translation slightly in mysql, postgres, and sqlite adapters (jeremyevans)
|
78
|
+
|
79
|
+
* Add Dataset#supports_cte_in_subqueries? for checking whether database supports WITH in subqueries (jeremyevans)
|
80
|
+
|
81
|
+
* Allow Model.set_dataset to accept Sequel::LiteralString arguments as table names (jeremyevans)
|
82
|
+
|
83
|
+
* Association :after_load hooks in lazy loading are now called after the associated objects have been cached (jeremyevans)
|
84
|
+
|
85
|
+
* Emulate handling of extract on MSSQL, using datepart (jeremyevans)
|
86
|
+
|
87
|
+
* Emulate handling of extract on SQLite, but you need to set Database#use_timestamp_timezones = false (jeremyevans)
|
88
|
+
|
89
|
+
* Abstract handling of ComplexExpressionMethods#extract so that it can work on databases that don't implement extract (jeremyevans)
|
90
|
+
|
91
|
+
* Emulate xor operator on SQLite (jeremyevans)
|
92
|
+
|
93
|
+
* Add Dataset#supports_where_true? for checking if the database supports WHERE true (or WHERE 1 if 1 is true) (jeremyevans)
|
94
|
+
|
95
|
+
* Fix eager loading via eager of one_to_one associations that match multiple associated objects and use order to pick the first one (jeremyevans)
|
96
|
+
|
1
97
|
=== 3.27.0 (2011-09-01)
|
2
98
|
|
3
99
|
* Add support for native prepared statements to the tinytds adapter (jeremyevans)
|
data/README.rdoc
CHANGED
@@ -12,8 +12,8 @@ toolkit for Ruby.
|
|
12
12
|
two-phase commit, transaction isolation, master/slave
|
13
13
|
configurations, and database sharding.
|
14
14
|
* Sequel currently has adapters for ADO, Amalgalite, DataObjects,
|
15
|
-
DB2, DBI, Firebird, Informix, JDBC, MySQL, Mysql2, ODBC,
|
16
|
-
Oracle, PostgreSQL, SQLite3, Swift, and TinyTDS.
|
15
|
+
DB2, DBI, Firebird, IBM_DB, Informix, JDBC, MySQL, Mysql2, ODBC,
|
16
|
+
OpenBase, Oracle, PostgreSQL, SQLite3, Swift, and TinyTDS.
|
17
17
|
|
18
18
|
== Resources
|
19
19
|
|
data/Rakefile
CHANGED
@@ -128,7 +128,7 @@ begin
|
|
128
128
|
spec_with_cov.call("spec_plugin", Dir["spec/extensions/*_spec.rb"], "Run extension/plugin specs")
|
129
129
|
spec_with_cov.call("spec_integration", Dir["spec/integration/*_test.rb"], "Run integration tests")
|
130
130
|
|
131
|
-
%w'postgres sqlite mysql informix oracle firebird mssql'.each do |adapter|
|
131
|
+
%w'postgres sqlite mysql informix oracle firebird mssql db2'.each do |adapter|
|
132
132
|
spec_with_cov.call("spec_#{adapter}", ["spec/adapters/#{adapter}_spec.rb"] + Dir["spec/integration/*_test.rb"], "Run #{adapter} specs")
|
133
133
|
end
|
134
134
|
rescue LoadError
|
data/doc/association_basics.rdoc
CHANGED
@@ -1518,3 +1518,51 @@ associations depends on another plugin that defines instance methods of
|
|
1518
1518
|
the same name. In that case, the instance methods of the dependent
|
1519
1519
|
plugin would override the association methods created by the main
|
1520
1520
|
plugin.
|
1521
|
+
|
1522
|
+
==== :eager_limit_strategy
|
1523
|
+
|
1524
|
+
This setting determines what strategy to use for loading the associations
|
1525
|
+
that use the :limit setting to limit the number of returned records. You
|
1526
|
+
can't use LIMIT directly, since you want a limit for each associated
|
1527
|
+
record, not a LIMIT on the number of records returned by the dataset.
|
1528
|
+
|
1529
|
+
By default, no strategy is used for one_to_one associations, and
|
1530
|
+
the :ruby strategy is used for *_many associations, which does a simple
|
1531
|
+
array slice after loading the associated records. That doesn't provide
|
1532
|
+
a performance advantage, since all records are still loaded from the
|
1533
|
+
database, but it at least makes sure the cached records are accurately
|
1534
|
+
limited as they would be in the lazy load case.
|
1535
|
+
|
1536
|
+
The reason no strategy is used by default for one_to_one associations
|
1537
|
+
is that none is needed for a true one_to_one association (since there
|
1538
|
+
is only one associated record per current record). However, if you are
|
1539
|
+
using a one_to_one association where the relationship is really one_to_many,
|
1540
|
+
and using an order to pick the first matching row, then if you don't
|
1541
|
+
specify an :eager_limit_strategy option, you'll be loading all related
|
1542
|
+
rows just to have Sequel ignore all rows after the first. By using a
|
1543
|
+
strategy to change the query to only return one associated record per
|
1544
|
+
current record, you can get much better database performance.
|
1545
|
+
|
1546
|
+
You can set a value of +true+ for this option to have Sequel select what
|
1547
|
+
it thinks is the best way of limiting the records for your database. You
|
1548
|
+
can also specify a symbol to manually choose a strategy. The available
|
1549
|
+
strategies are:
|
1550
|
+
|
1551
|
+
:distinct_on :: Uses DISTINCT ON to ensure only the first matching record
|
1552
|
+
is loaded (one_to_one associations only). This is used by
|
1553
|
+
default on PostgreSQL.
|
1554
|
+
:window_function :: Uses window functions if the database supports it.
|
1555
|
+
This is used by default on databases that support window
|
1556
|
+
functions.
|
1557
|
+
:correlated_subquery :: Uses a correlated subquery to get the information.
|
1558
|
+
This is never used by default as if you aren't careful,
|
1559
|
+
it can result in pathologically long running times
|
1560
|
+
This will not work correctly for association where
|
1561
|
+
the associated table has a composite primary key if
|
1562
|
+
the database doesn't support using IN
|
1563
|
+
with multiple columns. This will also not work on MySQL
|
1564
|
+
because MySQL has problems using IN with a correlated
|
1565
|
+
subquery that contains a limit.
|
1566
|
+
:ruby :: Uses ruby array slicing to emulate database limiting (*_many
|
1567
|
+
associations only). This is the default if the database doesn't
|
1568
|
+
support window functions.
|
data/doc/opening_databases.rdoc
CHANGED
@@ -46,6 +46,13 @@ unless the first argument is a hash. So the following statements are equivalent
|
|
46
46
|
DB = Sequel.postgres('blog', :host=>'localhost', :user=>'user', :password=>'password')
|
47
47
|
DB = Sequel.postgres(:host=>'localhost', :user=>'user', :password=>'password', :database=>'blog')
|
48
48
|
|
49
|
+
Note that using an adapter method forces the use of the specified adapter, not a database type, even
|
50
|
+
though some adapters have the same name as the database type. So if you
|
51
|
+
want to connect to SQLite, for example, you can do so using the sqlite, do, dbi, jdbc, odbc, and swift adapters.
|
52
|
+
If you want to connect to SQLite on JRuby using the jdbc adapter, you should not use <tt>Sequel.sqlite</tt>
|
53
|
+
for example, as that uses the C-based sqlite3 gem. Instead, the <tt>Sequel.jdbc</tt> would be appropriate (though
|
54
|
+
as mentioned below, using <tt>Sequel.connect</tt> is recommended instead of <tt>Sequel.jdbc</tt>).
|
55
|
+
|
49
56
|
== Passing a block to either method
|
50
57
|
|
51
58
|
Both the Sequel.connect method and the specialized adapter methods take a block. If you
|
@@ -145,10 +152,8 @@ the sqlite section below for details.
|
|
145
152
|
|
146
153
|
Requires: db2/db2cli
|
147
154
|
|
148
|
-
|
149
|
-
|
150
|
-
get a handle, and respects the :database, :user, and :password options. It doesn't
|
151
|
-
appear to respect the :host or :port options.
|
155
|
+
This is the older DB2 adapter. It's recommended you try the ibmdb adapter
|
156
|
+
instead for new DB2 work, as it is better supported.
|
152
157
|
|
153
158
|
=== dbi
|
154
159
|
|
@@ -201,6 +206,13 @@ Requires: fb (using code at http://github.com/wishdev/fb)
|
|
201
206
|
|
202
207
|
Does not support the :port option.
|
203
208
|
|
209
|
+
=== ibmdb
|
210
|
+
|
211
|
+
requires 'ibm_db'
|
212
|
+
|
213
|
+
This connects to DB2 using IBM_DB. This is the recommended adapter if you are
|
214
|
+
using a C-based ruby to connect to DB2.
|
215
|
+
|
204
216
|
=== informix
|
205
217
|
|
206
218
|
Does not support the :host or :port options. Depending on the configuration of your server
|
@@ -221,7 +233,7 @@ Requires: java
|
|
221
233
|
Houses Sequel's JDBC support when running on JRuby.
|
222
234
|
Support for individual database types is done using sub adapters.
|
223
235
|
There are currently subadapters for PostgreSQL, MySQL, SQLite, H2,
|
224
|
-
Oracle, MSSQL, JTDS, and
|
236
|
+
Oracle, MSSQL, JTDS, AS400, and DB2. All except Oracle, MSSQL, AS400, and DB2 can load the
|
225
237
|
jdbc-* gem, for those you need to have the .jar in your CLASSPATH
|
226
238
|
or load the Java class manually before calling Sequel.connect.
|
227
239
|
|
@@ -262,6 +274,8 @@ The following additional options are supported:
|
|
262
274
|
|
263
275
|
=== mysql
|
264
276
|
|
277
|
+
Requires: mysqlplus (or mysql if mysqlplus is not available)
|
278
|
+
|
265
279
|
The MySQL adapter does not support the pure-ruby MySQL adapter that used to ship with
|
266
280
|
ActiveRecord, it requires the native adapter.
|
267
281
|
|
@@ -278,6 +292,12 @@ The following additional options are supported:
|
|
278
292
|
* :read_timeout - Set the timeout in seconds for reading back results to a query.
|
279
293
|
* :connect_timeout - Set the timeout in seconds before a connection attempt is abandoned.
|
280
294
|
|
295
|
+
=== mysql2
|
296
|
+
|
297
|
+
This is a newer MySQL adapter that does typecasting in C, so it is often faster than the
|
298
|
+
mysql adapter. Supports the same additional options as the mysql adapter, except for :compress, and uses
|
299
|
+
:timeout instead of :read_timeout and :connect_timeout.
|
300
|
+
|
281
301
|
=== odbc
|
282
302
|
|
283
303
|
The ODBC adapter allows you to connect to any database with the appropriate ODBC drivers installed.
|
@@ -316,6 +336,8 @@ The following additional options are supported:
|
|
316
336
|
|
317
337
|
=== sqlite
|
318
338
|
|
339
|
+
Requires: sqlite3
|
340
|
+
|
319
341
|
As SQLite is a file-based database, the :host and :port options are ignored, and
|
320
342
|
the :database option should be a path to the file.
|
321
343
|
|
@@ -353,6 +375,8 @@ Examples:
|
|
353
375
|
|
354
376
|
=== tinytds
|
355
377
|
|
378
|
+
Requires: tiny_tds
|
379
|
+
|
356
380
|
Because the underscore is not a valid character in a URI schema, the adapter
|
357
381
|
is named tinytds instead of tiny_tds. The connection options are passed directly
|
358
382
|
to tiny_tds, except that the tiny_tds :username option is set to
|
@@ -5,6 +5,7 @@ database you are using, the Sequel prepared statement/bound variable API remains
|
|
5
5
|
the same. There is native support for prepared statements/bound variables on
|
6
6
|
the following adapters:
|
7
7
|
|
8
|
+
* ibmdb (prepared statements only)
|
8
9
|
* jdbc
|
9
10
|
* mysql (prepared statements only)
|
10
11
|
* mysql2 (prepared statements only)
|
@@ -0,0 +1,304 @@
|
|
1
|
+
= New Adapter Support
|
2
|
+
|
3
|
+
* Sequel now has much better support for the DB2 database.
|
4
|
+
|
5
|
+
* An ibmdb adapter has been added, and is the recommended adapter to
|
6
|
+
to use if you want to connect to DB2 from MRI.
|
7
|
+
|
8
|
+
* A jdbc db2 subadapter has been added, allowing good DB2 support on
|
9
|
+
JRuby.
|
10
|
+
|
11
|
+
* The db2 adapter has been cleaned up substantially, and now works
|
12
|
+
well, but it is still recommended that you switch to ibmdb if you
|
13
|
+
are using the db2 adapter.
|
14
|
+
|
15
|
+
* The firebird adapter has been split into shared and specific parts,
|
16
|
+
and quite a few fixes were made to it.
|
17
|
+
|
18
|
+
* A jdbc firebird subadapter has been added, allowing connection to
|
19
|
+
firebird databases from JRuby.
|
20
|
+
|
21
|
+
= New PostgreSQL 9.1 Features
|
22
|
+
|
23
|
+
* Dataset#returning has been added for using the RETURNING clause on
|
24
|
+
INSERT/UPDATE/DELETE queries. RETURNING allows such queries to
|
25
|
+
return results in much the same way as a SELECT query works.
|
26
|
+
When Dataset#returning is used, Dataset #insert, #update, and
|
27
|
+
#delete now accept a block that is passed to Dataset #fetch_rows
|
28
|
+
which is yielded plain ruby hashes for each row inserted, updated,
|
29
|
+
or deleted. If Dataset#returning is used and a block is not given
|
30
|
+
to those methods, those methods will return an array of plain hashes
|
31
|
+
for all rows inserted, updated, and deleted.
|
32
|
+
|
33
|
+
* Dataset#with_sql now treats a symbol as a first argument as a method
|
34
|
+
name to call to get the SQL. The expected use case for this is with
|
35
|
+
Dataset#returning and insert/update/delete:
|
36
|
+
|
37
|
+
DB[:items].
|
38
|
+
returning(:id).
|
39
|
+
with_sql(:update_sql, :b => :b + 1).
|
40
|
+
map(:id)
|
41
|
+
|
42
|
+
Basically, it makes it more easily to statically set the
|
43
|
+
insert/update/delete SQL, and then be able to use the full
|
44
|
+
dataset API for returning results. As mentioned above, using
|
45
|
+
Dataset#returning with #insert, #update, and #delete yields plain
|
46
|
+
hashes, so if you want to have the row_proc applied (e.g. you are
|
47
|
+
using models), you need to use this method instead, since you can
|
48
|
+
then call #each or #all to make sure the row_proc is called on all
|
49
|
+
returned rows.
|
50
|
+
|
51
|
+
* Dataset#with (common table expressions) now affects
|
52
|
+
INSERT/UPDATE/DELETE queries.
|
53
|
+
|
54
|
+
* Database#create_table? now uses CREATE TABLE IF NOT EXISTS on
|
55
|
+
PostgreSQL 9.1.
|
56
|
+
|
57
|
+
= Other New Features
|
58
|
+
|
59
|
+
* The :limit option is now respected when eager loading via either
|
60
|
+
eager or eager_graph. By default, Sequel will just do an array
|
61
|
+
slice of the resulting ruby array, which gets the correct answer,
|
62
|
+
but does not offer any performance improvements. Sequel also
|
63
|
+
offers a new :eager_limit_strategy option for using more advanced
|
64
|
+
query types that only load the related records from the database.
|
65
|
+
The available values for the :eager_limit_strategy option are:
|
66
|
+
|
67
|
+
:window_function: This uses the row_number window function
|
68
|
+
partitioned by the related key fields. It can only be used
|
69
|
+
on databases that support window functions (PostgreSQL 8.4+,
|
70
|
+
Microsoft SQL Server 2005+, DB2).
|
71
|
+
:correlated_subquery: This uses a correlated subquery that is
|
72
|
+
limited. It works on most databases except MySQL and DB2.
|
73
|
+
|
74
|
+
You can provide a value of true as the option to have Sequel
|
75
|
+
pick a strategy to use. Sequel will never use a correlated
|
76
|
+
subquery for true, since in some cases it can perform worse than
|
77
|
+
loading all related records and doing the array slice in ruby.
|
78
|
+
|
79
|
+
If you want to enable an eager_limit_strategy globally, you can
|
80
|
+
set Sequel::Model.default_eager_limit_strategy to a value, and
|
81
|
+
all associations that use :limit will default to using that
|
82
|
+
strategy.
|
83
|
+
|
84
|
+
* one_to_one associations that do not represent true one-to-one
|
85
|
+
database relationships, but represent one-to-many relationships
|
86
|
+
where you are only returning the first object based on a given
|
87
|
+
order are also now handled correctly when eager loading.
|
88
|
+
Previously, eager loading such associations resulted in the last
|
89
|
+
matching object being associated instead of the first matching
|
90
|
+
object being associated.
|
91
|
+
|
92
|
+
You can also use an :eager_limit_strategy for one_to_one
|
93
|
+
associations. In addition to the :window_function and
|
94
|
+
:correlated_subquery values, there is also a :distinct_on value
|
95
|
+
that is available on PostgreSQL for using DISTINCT ON, which is
|
96
|
+
the fastest strategy if you are using PostgreSQL.
|
97
|
+
|
98
|
+
* Dataset#map, #to_hash, #select_map, #select_order_map, and
|
99
|
+
#select_hash now accept arrays of symbols, and if given arrays
|
100
|
+
of symbols, use arrays of results. For example:
|
101
|
+
|
102
|
+
DB[:items].map([:id, :name])
|
103
|
+
# => [[1, 'foo'], [2, 'bar'], ...]
|
104
|
+
DB[:items].to_hash([:id, :foo_id], [:name, :bar_id])
|
105
|
+
# => {[1, 3]=>['foo', 5], [2, 4]=>['bar', 6], ...}
|
106
|
+
|
107
|
+
* For SQL expression objects where Sequel cannot deduce the type
|
108
|
+
of the object, it now will consider the type of the argument
|
109
|
+
when a &, |, or + operator is used. For example:
|
110
|
+
|
111
|
+
:x & 1
|
112
|
+
|
113
|
+
Previously, this did "x AND 1", now it does "x & 1". Using a
|
114
|
+
logical operator on an integer doesn't make sense, but it's
|
115
|
+
possible people did so if the database uses 1/0 for true/false.
|
116
|
+
Likewise:
|
117
|
+
|
118
|
+
:x + 'foo'
|
119
|
+
|
120
|
+
Previously, this did "x + 'foo'" (addition), now it does
|
121
|
+
"x || 'foo'" (string concatenation).
|
122
|
+
|
123
|
+
* The sql_string, sql_number, and sql_boolean methods are now
|
124
|
+
available on SQL::ComplexExpressions, so you can do:
|
125
|
+
|
126
|
+
(:x + 1).sql_string + ' foos'
|
127
|
+
# (x + 1) || ' foos'
|
128
|
+
|
129
|
+
Previously, there was not an easy way to generate such SQL
|
130
|
+
expressions.
|
131
|
+
|
132
|
+
* :after_load association hooks are now applied when using
|
133
|
+
eager_graph. Previously, they were only applied when using
|
134
|
+
eager, not when using eager_graph.
|
135
|
+
|
136
|
+
* Database#copy_table has been added to the postgres adapter if pg
|
137
|
+
is used as the underlying driver. It allows you to get very
|
138
|
+
fast exports of table data in text or CSV format. It also
|
139
|
+
accepts datasets, allowing fast exports of arbitrary queries
|
140
|
+
in text or CSV format.
|
141
|
+
|
142
|
+
* SQL extract support (:timestamp.extract(:year)) is now emulated
|
143
|
+
on the databases that don't natively support it, such as SQLite,
|
144
|
+
Microsoft SQL Server, and DB2. At least the following values are
|
145
|
+
supported for extraction: :year, :month, :day, :hour, :minute,
|
146
|
+
and :second.
|
147
|
+
|
148
|
+
* The bitwise XOR operator is now emulated on SQLite. Previously,
|
149
|
+
attempting to use it would cause the database to raise an error.
|
150
|
+
|
151
|
+
* A Database#use_timestamp_timezones accessor has been added on
|
152
|
+
SQLite. This allows you to turn off the use of timezones in
|
153
|
+
timestamps by setting the value to false. This is necessary if you
|
154
|
+
want you want to use the SQLite datetime functions, or the new
|
155
|
+
ability to emulate extract.
|
156
|
+
|
157
|
+
Note that this setting does not affect the current database
|
158
|
+
content. To convert old databases to the new format, you'll
|
159
|
+
have to resave all rows that have timestamps.
|
160
|
+
|
161
|
+
At some point in the future, Sequel may default to not using
|
162
|
+
timezones in timestamps by default on SQLite, so if you would
|
163
|
+
like to rely on the current behavior, you should set this
|
164
|
+
accessor to true now.
|
165
|
+
|
166
|
+
* Sequel now works around bugs in MySQL when using a subselect with
|
167
|
+
a LIMIT by using a nested subselect.
|
168
|
+
|
169
|
+
* Sequel now works around issues in Microsoft SQL Server and DB2 when
|
170
|
+
using a subselect with IN/NOT IN that uses the emulated offset
|
171
|
+
support.
|
172
|
+
|
173
|
+
* The jdbc adapter now returns java.sql.Clob objects as
|
174
|
+
Sequel::SQL::Blobs.
|
175
|
+
|
176
|
+
* Sequel now considers database clob types as the :blob schema type.
|
177
|
+
|
178
|
+
* Sequel::SQLTime.create has been added for more easily creating
|
179
|
+
instances:
|
180
|
+
|
181
|
+
Sequel::SQLTime.create(hour, minute, second, usec)
|
182
|
+
|
183
|
+
* Dataset#select_all now accepts SQL::AliasedExpression and
|
184
|
+
SQL::JoinClause arguments and returns the appropriate
|
185
|
+
SQL::ColumnAll value that selects all columns from the related
|
186
|
+
table.
|
187
|
+
|
188
|
+
* Model.set_dataset now accepts Sequel::LiteralString objects that
|
189
|
+
represent table names. This usage is not encouraged except in
|
190
|
+
rare cases such as using a set returning function in PostgreSQL.
|
191
|
+
|
192
|
+
* Dataset#supports_cte? now takes an optional argument specifying the
|
193
|
+
type of query (:insert, :update, :delete, :select). It defaults to
|
194
|
+
:select.
|
195
|
+
|
196
|
+
* Dataset#supports_returning? has been added. It requires an
|
197
|
+
argument specifying the type of query (:insert, :update, or
|
198
|
+
:delete).
|
199
|
+
|
200
|
+
* Dataset#supports_cte_in_subqueries? has been added for checking
|
201
|
+
for support for this ability. Apparently, only PostgreSQL
|
202
|
+
currently supports this. For other adapters that support CTEs but
|
203
|
+
not in subqueries, if a subquery with a CTE is used in a JOIN, the
|
204
|
+
CTE is moved from the subquery to the main query.
|
205
|
+
|
206
|
+
* Dataset#supports_select_all_and_column has been added for seeing
|
207
|
+
if "SELECT *, foo ..." style queries are supported. This is false
|
208
|
+
on DB2, which doesn't allow such queries. When it is false, using
|
209
|
+
select_append on a dataset that doesn't specifically select columns
|
210
|
+
will now change the query to do "SELECT table.*, foo ..." instead,
|
211
|
+
working around the limitation on DB2.
|
212
|
+
|
213
|
+
* Dataset#supports_ordered_distinct_on? has been added. Currently,
|
214
|
+
this is only true on PostgreSQL. MySQL can emulate DISTINCT ON
|
215
|
+
using GROUP BY, but it doesn't respect ORDER BY, so it some
|
216
|
+
cases it cannot be used equivalently.
|
217
|
+
|
218
|
+
* Dataset#supports_where_true? has been added for checking for support
|
219
|
+
of WHERE TRUE (or WHERE 1 if 1 is true). Not all databases support
|
220
|
+
using such a construct, and on the databases that do not, you have
|
221
|
+
to use WHERE (1 = 1) or something similar.
|
222
|
+
|
223
|
+
= Other Improvements
|
224
|
+
|
225
|
+
* Sequel 3.27.0 was negatively affected by a serious bug in
|
226
|
+
ActiveSupport's Time.=== that has still not been fixed, which
|
227
|
+
broke the literalization of Time objects. In spite of the bad
|
228
|
+
precedent it sets, Sequel now avoids using Time.=== on a
|
229
|
+
subclass of Time to work around this ActiveSupport bug.
|
230
|
+
|
231
|
+
* Dataset#with_pk now uses a qualified primary key instead of an
|
232
|
+
unqualified primary key, which means it can now be used correctly
|
233
|
+
after joining to a separate table.
|
234
|
+
|
235
|
+
* Association after_load hooks when lazy loading are now called
|
236
|
+
after the association has been loaded, which allows them to change
|
237
|
+
which records are cached. This makes the lazy load case more
|
238
|
+
similar to the eager load case.
|
239
|
+
|
240
|
+
* The metaprogrammatically created methods that implement Sequel's
|
241
|
+
DSL support have been made significantly faster by using
|
242
|
+
module_eval instead of define_method.
|
243
|
+
|
244
|
+
* The type translation in the postgres, mysql, and sqlite adapters
|
245
|
+
has been made faster by using Method objects that result in more
|
246
|
+
direct processing.
|
247
|
+
|
248
|
+
* Typecasting values for time columns from Time values to
|
249
|
+
Sequel::SQLTime values now correctly handles fractional seconds on
|
250
|
+
ruby 1.9.
|
251
|
+
|
252
|
+
= Backwards Compatibility
|
253
|
+
|
254
|
+
* Dataset#insert_returning_sql has been changed to a private method
|
255
|
+
in the PostgreSQL and Firebird adapters, and it operates
|
256
|
+
differently than it did previously. The private
|
257
|
+
#insert_returning_pk_sql and #insert_returning_select_sql methods
|
258
|
+
have been removed.
|
259
|
+
|
260
|
+
* Dataset#with_pk no longer does some defensive checking for misuse of
|
261
|
+
primary keys (e.g. providing a composite key when the model uses
|
262
|
+
a single key). Previously, Sequel would raise an Error
|
263
|
+
immediately, now such behavior is undefined, with the most likely
|
264
|
+
behavior being the database raising an Error.
|
265
|
+
|
266
|
+
* The :alias_association_type_map and :alias_association_name_map
|
267
|
+
settings have been removed from the :eager_graph dataset option,
|
268
|
+
in favor of just storing the related association reflection.
|
269
|
+
|
270
|
+
* The internals of the db2 adapter have changed substantially, if you
|
271
|
+
were relying on some of the private methods defined in it, you will
|
272
|
+
probably have to modify your code.
|
273
|
+
|
274
|
+
* The firebird adapter was substanially modified, specifically parts
|
275
|
+
related to insert returning autogenerated primary key values, so if
|
276
|
+
you were previously using the adapter you should probably take more
|
277
|
+
care than usual when testing your upgrade.
|
278
|
+
|
279
|
+
* The Dataset::WITH_SUPPORTED constant has been removed.
|
280
|
+
|
281
|
+
* The Dataset#supports_cte? method now accepts an optional argument.
|
282
|
+
If you overrode this method, your overridden method now must
|
283
|
+
accept an optional argument.
|
284
|
+
|
285
|
+
* If you were previously doing:
|
286
|
+
|
287
|
+
:x & 1
|
288
|
+
|
289
|
+
and wanting "x AND 1", you have to switch to:
|
290
|
+
|
291
|
+
:x.sql_boolean & 1
|
292
|
+
|
293
|
+
Likewise, if you were previously doing:
|
294
|
+
|
295
|
+
:x + 'foo'
|
296
|
+
|
297
|
+
and wanting "x + 'foo'", you need to switch to:
|
298
|
+
|
299
|
+
:x.sql_number + 'foo'
|
300
|
+
|
301
|
+
* Sequel no longer does defensive type checking in the SQL expression
|
302
|
+
support, as it was often more strict than the database and would
|
303
|
+
not allow the creation of expressions that were valid for the
|
304
|
+
database.
|