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,202 +0,0 @@
|
|
1
|
-
= New Features
|
2
|
-
|
3
|
-
* Prepared statements now support :map and :to_hash prepared
|
4
|
-
statement types. The main reason for this is that certain
|
5
|
-
extensions (e.g. sequel_pg) optimize map/to_hash calls, and
|
6
|
-
there previously was not a way to use prepared statements
|
7
|
-
with the map/to_hash optimizations.
|
8
|
-
|
9
|
-
* Sequel.empty_array_handle_nulls has been added to change how
|
10
|
-
IN/NOT IN operations with an empty array are handled. See
|
11
|
-
the Backwards Compatibility section for details.
|
12
|
-
|
13
|
-
* 5 new association options have been added that allow you to
|
14
|
-
define associations where the underlying columns clash with
|
15
|
-
standard ruby method names:
|
16
|
-
|
17
|
-
many_to_one :primary_key_method
|
18
|
-
one_to_many :key_method
|
19
|
-
one_to_many :primary_key_column
|
20
|
-
many_to_many :left_primary_key_column
|
21
|
-
many_to_many :right_primary_key_method
|
22
|
-
|
23
|
-
Using these new options, you can now define associations
|
24
|
-
that work correctly when the underlying primary/foreign key
|
25
|
-
columns clash with existing ruby method names. See the RDoc
|
26
|
-
for details.
|
27
|
-
|
28
|
-
* A use_after_commit_rollback setting has been added to models.
|
29
|
-
This defaults to true, but can be set to false for performance
|
30
|
-
or to allow models to be used in prepared transactions
|
31
|
-
(which don't support after_commit/after_rollback).
|
32
|
-
|
33
|
-
* Dataset#update_ignore has been added when connecting to MySQL,
|
34
|
-
enabling use of the UPDATE IGNORE syntax to skip updating a row
|
35
|
-
if the update would cause a unique constraint to be violated.
|
36
|
-
|
37
|
-
* Database#indexes is now supported when connecting to Microsoft
|
38
|
-
SQL Server.
|
39
|
-
|
40
|
-
* On Microsoft SQL Server, the :include option is now supported
|
41
|
-
when creating indexes, for storing column values in the index,
|
42
|
-
which can be used by the query optimizer.
|
43
|
-
|
44
|
-
= Other Improvements
|
45
|
-
|
46
|
-
* The filtering/excluding by associations code now uses qualified
|
47
|
-
identifiers instead of unqualified identifiers, which allows it
|
48
|
-
to avoid ambiguous column names if you are doing your own joins.
|
49
|
-
|
50
|
-
* Virtual row blocks that return arrays are now handled correctly
|
51
|
-
in Dataset#select_map/select_order_map.
|
52
|
-
|
53
|
-
* Dataset#select_map/select_order_map can now take both a block
|
54
|
-
argument as well as a regular argument.
|
55
|
-
|
56
|
-
* Dataset#select_order_map now handles virtual row blocks that
|
57
|
-
return ordered expressions.
|
58
|
-
|
59
|
-
* Database#table_exists? should no longer generate false negatives
|
60
|
-
if you only have permission to retrieve some column values but
|
61
|
-
not all. Note that if you lack permission to SELECT from the
|
62
|
-
table itself, table_exists? can still generate false negatives.
|
63
|
-
|
64
|
-
* The active_model plugin now supports ActiveModel 3.2, by adding
|
65
|
-
support for to_partial_path.
|
66
|
-
|
67
|
-
* The serialization_modification_detection plugin now handles
|
68
|
-
changed_columns correctly both for new objects and after saving
|
69
|
-
objects.
|
70
|
-
|
71
|
-
* The serialization plugin now clears the deserialized values when
|
72
|
-
it does the automatic refresh after saving a new object, mostly for
|
73
|
-
consistency. You can use the skip_create_refresh plugin to skip
|
74
|
-
refreshing when creating a new model object.
|
75
|
-
|
76
|
-
* Column default values are now wrapped in parentheses on SQLite,
|
77
|
-
which fixes some cases such as when the default is an SQL function
|
78
|
-
call.
|
79
|
-
|
80
|
-
* Alter table emulation now works correctly on SQLite when foreign
|
81
|
-
keys reference the table being altered. The emulation requires
|
82
|
-
a renaming/deleting the existing table and creating a new table,
|
83
|
-
which can break foreign key references. Sequel now disables the
|
84
|
-
foreign key PRAGMA when altering tables, so SQLite won't track
|
85
|
-
the table renames and break the foreign key relationships.
|
86
|
-
|
87
|
-
* The set_column_type table alteration method no longer modifies
|
88
|
-
default values and NULL/NOT NULL settings on Microsoft SQL
|
89
|
-
Server, H2, and SQLite.
|
90
|
-
|
91
|
-
* On MySQL, Time/DateTime columns now use the timestamp type if the
|
92
|
-
default value is Sequel::CURRENT_TIMESTAMP, since it is currently
|
93
|
-
impossible for MySQL to have a non-constant default for a
|
94
|
-
datetime column (without using a workaround like a trigger).
|
95
|
-
|
96
|
-
* Metadata methods such as tables, views, and view_exists? are now
|
97
|
-
handled correctly on Oracle if custom identifier input methods
|
98
|
-
are used.
|
99
|
-
|
100
|
-
* Sequel now ignores errors that occur when attempting to get
|
101
|
-
information on column defaults in Oracle (which can happen if you
|
102
|
-
lack permission to the appropriate table). Previously, such errors
|
103
|
-
would cause the schema parser to raise an error, now, the schema
|
104
|
-
information is just returned without default information.
|
105
|
-
|
106
|
-
* Database#indexes now skips the primary key index when connecting to
|
107
|
-
DB2, Derby, HSQLDB, and Oracle via the jdbc adapter.
|
108
|
-
|
109
|
-
* Database#indexes now works correctly on DB2.
|
110
|
-
|
111
|
-
* The progress adapter has been fixed, it had been broken since the
|
112
|
-
dataset literalization refactoring.
|
113
|
-
|
114
|
-
* Dataset#naked! now works correctly. Previously, it just returned
|
115
|
-
the receiver unmodified.
|
116
|
-
|
117
|
-
* Dataset#paginate! has been removed, as it was broken.
|
118
|
-
|
119
|
-
* The query extension no longer breaks Dataset#clone if an argument
|
120
|
-
is not given.
|
121
|
-
|
122
|
-
* Transaction related queries are no longer logged twice in the mock
|
123
|
-
adapter.
|
124
|
-
|
125
|
-
= Backwards Compatibility
|
126
|
-
|
127
|
-
* Sequel's default handling of NOT IN operators with an empty array
|
128
|
-
of values has changed, which can change which rows are returned for
|
129
|
-
such queries.
|
130
|
-
|
131
|
-
Previously, Sequel was inconsistent in that it tried to handle NULL
|
132
|
-
values correctly in the IN case, but not in the NOT IN case. Now,
|
133
|
-
it defaults to handling NULL values correctly in both cases:
|
134
|
-
|
135
|
-
# 3.31.0
|
136
|
-
DB[:a].where(:b=>[])
|
137
|
-
# SELECT * FROM a WHERE (b != b)
|
138
|
-
DB[:a].exclude(:b=>[])
|
139
|
-
# SELECT * FROM a WHERE (1 = 1)
|
140
|
-
|
141
|
-
# 3.32.0
|
142
|
-
DB[:a].where(:b=>[])
|
143
|
-
# SELECT * FROM a WHERE (b != b)
|
144
|
-
DB[:a].exclude(:b=>[])
|
145
|
-
# SELECT * FROM a WHERE (b = b)
|
146
|
-
|
147
|
-
The important change in behavior is that in the NOT IN case, if
|
148
|
-
the left hand argument is NULL, the filter returns NULL instead
|
149
|
-
of true. This has the potential to change query results.
|
150
|
-
|
151
|
-
"Correct" here is really an opinion and not a fact, as there are
|
152
|
-
valid arguments for the alternative behavior:
|
153
|
-
|
154
|
-
DB[:a].where(:b=>[])
|
155
|
-
# SELECT * FROM a WHERE (1 = 0)
|
156
|
-
DB[:a].exclude(:b=>[])
|
157
|
-
# SELECT * FROM a WHERE (1 = 1)
|
158
|
-
|
159
|
-
The difference is that the "correct" NULL behavior is more
|
160
|
-
consistent with the non-empty array cases. For example, if b is
|
161
|
-
NULL:
|
162
|
-
|
163
|
-
# "Correct" NULL handling
|
164
|
-
# Empty array: where(:b=>[])
|
165
|
-
WHERE (b != b) # NULL
|
166
|
-
WHERE (b = b) # NULL
|
167
|
-
# Non-empty array: where(:b=>[1, 2])
|
168
|
-
WHERE (b IN (1, 2)) # NULL
|
169
|
-
WHERE (b NOT IN (1, 2)) # NULL
|
170
|
-
|
171
|
-
# Static boolean handling
|
172
|
-
# Empty array: where(:b=>[])
|
173
|
-
WHERE (1 = 0) # false
|
174
|
-
WHERE (1 = 1) # true
|
175
|
-
# Non-empty array: where(:b=>[1, 2])
|
176
|
-
WHERE (b IN (1, 2)) # NULL
|
177
|
-
WHERE (b NOT IN (1, 2)) # NULL
|
178
|
-
|
179
|
-
Sequel chooses to default to behavior consistent with the non-empty
|
180
|
-
array cases (similar to SQLAlchemy). However, there are two
|
181
|
-
downsides to this handling. The first is that some databases with
|
182
|
-
poor optimizers (e.g. MySQL) might do a full table scan with the
|
183
|
-
default syntax. The second is that the static boolean handling may
|
184
|
-
be generally perferable, if you believe that IN/NOT IN with an
|
185
|
-
empty array should always be true or false and never NULL even if
|
186
|
-
the left hand argument is NULL.
|
187
|
-
|
188
|
-
As there really isn't a truly correct answer in this case, Sequel
|
189
|
-
defaults to the "correct" NULL handling, and allows you to switch
|
190
|
-
to the static boolean handling via:
|
191
|
-
|
192
|
-
Sequel.empty_array_handle_nulls = false
|
193
|
-
|
194
|
-
This is currently a global setting, it may be made Database or
|
195
|
-
Dataset specific later if requested. Also, it is possible the
|
196
|
-
default will switch in the future, so if you care about a specific
|
197
|
-
handling, you should set your own default.
|
198
|
-
|
199
|
-
* Database#table_exists? now only rescues Sequel::DatabaseErrors
|
200
|
-
instead of StandardErrors, so it's possible it will raise errors
|
201
|
-
instead of returning false on custom adapters that don't wrap
|
202
|
-
their errors correctly.
|
@@ -1,157 +0,0 @@
|
|
1
|
-
= New Features
|
2
|
-
|
3
|
-
* A server_block extension has been added that makes Sequel's
|
4
|
-
sharding support easier to use by scoping database access inside
|
5
|
-
the block to a given server/shard:
|
6
|
-
|
7
|
-
Sequel.extension :server_block
|
8
|
-
DB.extend Sequel::ServerBlock
|
9
|
-
DB.with_server(:shard_1) do
|
10
|
-
# All of these will execute against shard_1
|
11
|
-
DB.tables
|
12
|
-
DB[:table].all
|
13
|
-
DB.run 'SOME SQL'
|
14
|
-
end
|
15
|
-
|
16
|
-
* An arbitrary_servers extension has been added that extends
|
17
|
-
Sequel's sharding support so that you can use arbitrary
|
18
|
-
connection options instead of referencing an existing, predefined
|
19
|
-
server/shard:
|
20
|
-
|
21
|
-
Sequel.extension :arbitrary_servers
|
22
|
-
DB.pool.extend Sequel::ArbitraryServers
|
23
|
-
DB[:table].server(:host=>'foo', :database=>'bar').all
|
24
|
-
|
25
|
-
You can use this extension in conjunction with the server_block
|
26
|
-
extension:
|
27
|
-
|
28
|
-
DB.with_server(:host=>'foo', :database=>'bar') do
|
29
|
-
DB.synchronize do
|
30
|
-
# All of these will execute on host foo, database bar
|
31
|
-
DB.tables
|
32
|
-
DB[:table].all
|
33
|
-
DB.run 'SOME SQL'
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
The combination of these two extensions makes it pretty easy to
|
38
|
-
write a thread-safe Rack middleware that scopes each request
|
39
|
-
to an arbitrary database.
|
40
|
-
|
41
|
-
* The sqlite adapter now supports an integer_booleans setting
|
42
|
-
for using 1/0 for true/false values, instead of the the 't'/'f'
|
43
|
-
values used by default. As SQLite recommends using integers to
|
44
|
-
store booleans, converting your existing database and enabling
|
45
|
-
this setting is recommended, but for backwards compatibility it
|
46
|
-
is set to false. You can convert you existing database by doing
|
47
|
-
the following for each table/column that has booleans:
|
48
|
-
|
49
|
-
DB[:table].update(:boolean_column=>{'t'=>1}.
|
50
|
-
case(0, :boolean_column))
|
51
|
-
|
52
|
-
The integer_booleans default setting may change in a future
|
53
|
-
version of Sequel, so you should set it manually to false if you
|
54
|
-
prefer the current default.
|
55
|
-
|
56
|
-
* You can now disable transaction use in migrations, in one of two
|
57
|
-
ways. You generally only need to do this if you are using an
|
58
|
-
SQL query inside a migration that is specifically not supported
|
59
|
-
inside a transaction, such as CREATE INDEX CONCURRENTLY on
|
60
|
-
PostgreSQL.
|
61
|
-
|
62
|
-
The first way to disable transactions is on a per-migration basis
|
63
|
-
by calling the no_transaction method inside the Sequel.migration
|
64
|
-
block:
|
65
|
-
|
66
|
-
Sequel.migration do
|
67
|
-
no_transaction
|
68
|
-
change do
|
69
|
-
# ...
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
That will make it so that a transaction is not used for that
|
74
|
-
particular migration. The second way is passing the
|
75
|
-
:use_tranctions=>false option when calling Migrator.run (using
|
76
|
-
the API), which will completely disable transactions for all
|
77
|
-
migrations during the migrator run.
|
78
|
-
|
79
|
-
* The postgres adapter now respects an :sslmode option when using
|
80
|
-
pg as the underlying driver, you can set the value of this option to
|
81
|
-
disable, allow, prefer, or require.
|
82
|
-
|
83
|
-
* Database#create_schema and #drop_schema are now defined when
|
84
|
-
connecting to PostgreSQL.
|
85
|
-
|
86
|
-
* Database#supports_savepoints_in_prepared_transactions? has been
|
87
|
-
added for checking if savepoints are supported inside prepared
|
88
|
-
transactions. This is true if both savepoints and prepared
|
89
|
-
transactions are both supported, except on MySQL > 5.5.12 (due to
|
90
|
-
MySQL bug 64374).
|
91
|
-
|
92
|
-
= Other Improvements
|
93
|
-
|
94
|
-
* The mysql and mysql2 adapters now both provide an accurate number
|
95
|
-
of rows matched, so Sequel::Model usage on those adapters will now
|
96
|
-
raise a NoExistingObject exception by default if you attempt to
|
97
|
-
delete or update an instance that no longer exists in the database.
|
98
|
-
|
99
|
-
* Foreign key creation now works correctly without specifying the
|
100
|
-
:key option when using MySQL with the InnoDB table engine. InnoDB
|
101
|
-
requires that you list the column explicitly, even if you are
|
102
|
-
referencing the primary key of the table, so if the :key option is
|
103
|
-
not given, the database schema is introspected to find the primary
|
104
|
-
key for the table. If you are attempting to create a table with
|
105
|
-
a self-referential foreign key, it introspects the generator to
|
106
|
-
get the primary key for the table.
|
107
|
-
|
108
|
-
* The sqlite adapter will now return 1/0 stored in boolean columns as
|
109
|
-
true/false. It will convert dates stored as Integers/Floats to
|
110
|
-
Date objects by assuming they represent the julian date. It will
|
111
|
-
convert times stored as Integers/Floats to Sequel::SQLTime objects
|
112
|
-
by assuming they represent a number of seconds. It will convert
|
113
|
-
datetimes stored as Integers by assuming they represent a unix
|
114
|
-
epoch time integer, and datetimes stored as Floats by assuming the
|
115
|
-
represent the julian date (with fractional part representing the
|
116
|
-
time of day). These changes make Sequel handle SQLite's
|
117
|
-
recommendations for boolean/date/time storage.
|
118
|
-
|
119
|
-
* The instance_hooks plugin's (before|after)_*_hook methods now return
|
120
|
-
self so they can be used in a method chain.
|
121
|
-
|
122
|
-
* The list plugin now automatically adds new entries to the end of the
|
123
|
-
list when creating the entries, if the position field is not
|
124
|
-
specifically set.
|
125
|
-
|
126
|
-
* An identifier_output_method is now respected in the mysql2 adapter.
|
127
|
-
|
128
|
-
* NaN/Infinity Float values are now quoted correctly for input on
|
129
|
-
PostgreSQL, and the postgres adapter correctly handles them on
|
130
|
-
retrieval from the database.
|
131
|
-
|
132
|
-
* The :collate column option is now respected when creating tables or
|
133
|
-
altering columns on MySQL.
|
134
|
-
|
135
|
-
* You can now force use of the TimestampMigrator when the
|
136
|
-
IntegerMigrator would be used by default by calling
|
137
|
-
TimestampMigrator.apply or .run.
|
138
|
-
|
139
|
-
* Mock adapter usage with a specific SQL dialect now uses the
|
140
|
-
appropriate defaults for quoting identifiers.
|
141
|
-
|
142
|
-
* You can now disable the use of sudo in the rake install/uninstall
|
143
|
-
tasks using the SUDO='' environment variable.
|
144
|
-
|
145
|
-
* A very misleading error message has been fixed when attempting
|
146
|
-
to constantize an invalid string in the model inflector.
|
147
|
-
|
148
|
-
= Backwards Compatibility
|
149
|
-
|
150
|
-
* The sqlite adapter now typecasts columns that SQLite stores as
|
151
|
-
INTEGER/REAL. Previously, it only typecasted columns that
|
152
|
-
SQLite stored as TEXT/BLOB. For details about SQLite storage, see
|
153
|
-
http://www.sqlite.org/datatype3.html.
|
154
|
-
|
155
|
-
Any custom type conversion procs used with the sqlite adapter should
|
156
|
-
be modified to work with Integer/Float objects in addition to String
|
157
|
-
objects.
|
@@ -1,671 +0,0 @@
|
|
1
|
-
= New PostgreSQL Extensions
|
2
|
-
|
3
|
-
* A pg_array extension has been added, supporting PostgreSQL's
|
4
|
-
numeric and string array types. Both single dimensional and
|
5
|
-
multi-dimensional array types are supported. Array values are
|
6
|
-
returned as instances of Sequel::Postgres::PGArray, which is a
|
7
|
-
delegate class of Array. You can turn an existing array into
|
8
|
-
a PGArray using Array#pg_array.
|
9
|
-
|
10
|
-
If you are using arrays in model objects, you need to load
|
11
|
-
support for that:
|
12
|
-
|
13
|
-
DB.extend Sequel::Postgres::PGArray::DatabaseMethods
|
14
|
-
|
15
|
-
This makes schema parsing and typecasting of array columns work
|
16
|
-
correctly.
|
17
|
-
|
18
|
-
This extension also allows you to use PGArray objects and arrays
|
19
|
-
in bound variables when using the postgres adapter with pg.
|
20
|
-
|
21
|
-
* A pg_hstore extension has been added, supporting PostgreSQL's hstore
|
22
|
-
type, which is a simple hash with string keys and string or NULL
|
23
|
-
values. hstore values are retrieved as instances of
|
24
|
-
Sequel::Postgres::HStore, which is a delegate class of Hash. You
|
25
|
-
can turn an existing hash into an hstore using Hash#hstore.
|
26
|
-
|
27
|
-
If you are using hstores in model objects, you need to load
|
28
|
-
support for that:
|
29
|
-
|
30
|
-
DB.extend Sequel::Postgres::HStore::DatabaseMethods
|
31
|
-
|
32
|
-
This makes schema parsing and typecasting of hstore columns work
|
33
|
-
correctly.
|
34
|
-
|
35
|
-
This extension also allows you to use HStore objects and hashes
|
36
|
-
in bound variables when using the postgres adapter with pg.
|
37
|
-
|
38
|
-
* A pg_array_ops extension has been added, making it easier to call
|
39
|
-
PostgreSQL array operators and functions using plain ruby code.
|
40
|
-
Examples:
|
41
|
-
|
42
|
-
a = :array_column.pg_array
|
43
|
-
a[1] # array_column[1]
|
44
|
-
a[1][2] # array_column[1][2]
|
45
|
-
a.push(1) # array_column || 1
|
46
|
-
a.unshift(1) # 1 || array_column
|
47
|
-
a.any # ANY(array_column)
|
48
|
-
a.join # array_to_string(array_column, '', NULL)
|
49
|
-
|
50
|
-
If you are also using the pg_array extension, you can turn
|
51
|
-
a PGArray object into a query object, which allows you to run
|
52
|
-
operations on array literals:
|
53
|
-
|
54
|
-
a = [1, 2].pg_array.op
|
55
|
-
a.push(3) # ARRAY[1,2] || 3
|
56
|
-
|
57
|
-
* A pg_hstore_ops extension has been added, making it easier to call
|
58
|
-
PostgreSQL hstore operators and functions using plain ruby code.
|
59
|
-
Examples:
|
60
|
-
|
61
|
-
h = :hstore_column.hstore
|
62
|
-
h['a'] # hstore_column -> 'a'
|
63
|
-
h.has_key?('a') # hstore_column ? 'a'
|
64
|
-
h.keys # akeys(hstore_column)
|
65
|
-
h.to_array # hstore_to_array(hstore_column)
|
66
|
-
|
67
|
-
If you are also using the pg_hstore extension, you can turn
|
68
|
-
an HStore object into a query object, which allows you to run
|
69
|
-
operations on hstore literals:
|
70
|
-
|
71
|
-
h = {'a' => 'b'}.hstore.op
|
72
|
-
h[a] # '"a"=>"b"'::hstore -> 'a'
|
73
|
-
|
74
|
-
* A pg_auto_parameterize extension has been added for automatically
|
75
|
-
using bound variables for all queries. For example, it can take
|
76
|
-
code such as:
|
77
|
-
|
78
|
-
DB[:table].where(:column=>1)
|
79
|
-
|
80
|
-
and do:
|
81
|
-
|
82
|
-
SELECT * FROM table WHERE column = $1; -- [1]
|
83
|
-
|
84
|
-
Note that automatically parameterizing queries is not generally
|
85
|
-
faster unless the bound variables are large (i.e. long text/bytea
|
86
|
-
values). Also, there are multiple corner cases when automatically
|
87
|
-
parameterizing queries, though most can be worked around by
|
88
|
-
adding explicit casts.
|
89
|
-
|
90
|
-
* A pg_statement_cache extension has been added that works with the
|
91
|
-
pg_auto_parameterize extension for automatically caching prepared
|
92
|
-
statements and reusing them when using the postgres adapter with
|
93
|
-
pg. The combination of these two extensions makes it possible to
|
94
|
-
take an entire Sequel application and turn most or all of the
|
95
|
-
queries into prepared statements.
|
96
|
-
|
97
|
-
Note that these two extensions do not necessarily improve
|
98
|
-
performance. For simple queries, they actually hurt performance.
|
99
|
-
They do help for complex queries, but in all cases, it's faster
|
100
|
-
to use Sequel's prepared statements API manually.
|
101
|
-
|
102
|
-
= Other New Extensions
|
103
|
-
|
104
|
-
* A query_literals extension has been added that makes the select,
|
105
|
-
group, and order methods operate similar to the filter methods in
|
106
|
-
that if they are given a regular string as their first argument,
|
107
|
-
they treat it as a literal string, with additional arguments, if
|
108
|
-
any, used as placeholder values. This extension allows you to
|
109
|
-
write code such as:
|
110
|
-
|
111
|
-
DB[:table].select('a, b, ?' 2).group('a, b').order('c')
|
112
|
-
# Without query_literals:
|
113
|
-
# SELECT 'a, b, ?', 2 FROM table GROUP BY 'a, b' ORDER BY 'c'
|
114
|
-
# With query_literals:
|
115
|
-
# SELECT a, b, 2 FROM table GROUP BY a, b ORDER BY c
|
116
|
-
|
117
|
-
Sequel's default handling in this case is to use literal strings,
|
118
|
-
which is generally not desired and on some databases not even
|
119
|
-
valid syntax. In general, you'll probably want to use this
|
120
|
-
extension for all of a database's datasets, which you can do via:
|
121
|
-
|
122
|
-
Sequel.extension :query_literals
|
123
|
-
DB.extend_datasets(Sequel::QueryLiterals)
|
124
|
-
|
125
|
-
The next major version of Sequel (4.0.0) will probably integrate
|
126
|
-
this extension into the core library.
|
127
|
-
|
128
|
-
* A select_remove extension has been added that adds
|
129
|
-
Dataset#select_remove, for removing selected columns/expressions
|
130
|
-
from a dataset:
|
131
|
-
|
132
|
-
ds = DB[:table]
|
133
|
-
# Assume table has columns a, b, and c
|
134
|
-
|
135
|
-
ds.select_remove(:c)
|
136
|
-
# SELECT a, b FROM table
|
137
|
-
|
138
|
-
# Removal by column alias
|
139
|
-
ds.select(:a, :b___c, :c___b).select_remove(:c)
|
140
|
-
# SELECT a, c AS b FROM table
|
141
|
-
|
142
|
-
# Removal by expression
|
143
|
-
ds.select(:a, :b___c, :c___b).select_remove(:c___b)
|
144
|
-
# SELECT a, b AS c FROM table
|
145
|
-
|
146
|
-
This method makes it easier to select all columns except for the
|
147
|
-
columns given. This is common in cases where a table has a few
|
148
|
-
large columns that are expensive to retrieve. This method does
|
149
|
-
have some corner cases, so read the documentation before using it.
|
150
|
-
|
151
|
-
* A schema_caching extension has added that makes it possible for
|
152
|
-
Database instances to dump the cached schema metadata to a
|
153
|
-
marshalled file, and load the cached schema metadata from the file.
|
154
|
-
This can be significantly faster than reparsing the schema from the
|
155
|
-
database, especially for databases with high latency.
|
156
|
-
|
157
|
-
bin/sequel -S has been added to dump the schema for the given
|
158
|
-
database to a file, and DB.load_schema_cache(filename) can be used
|
159
|
-
to populate the schema cache inside your application. This should
|
160
|
-
be done after creating the Database object but before loading your
|
161
|
-
model files.
|
162
|
-
|
163
|
-
Note that Sequel does no checking to ensure that the cached schema
|
164
|
-
currently reflects the state of the database. That is up to the
|
165
|
-
application.
|
166
|
-
|
167
|
-
* A null_dataset extension has been added, which adds
|
168
|
-
Dataset#nullify for creating a dataset that will not issue a
|
169
|
-
database query. It implements the null object pattern for
|
170
|
-
datasets, and is probably most useful in methods that must return
|
171
|
-
a dataset, but can determine that such a dataset will never return
|
172
|
-
a row.
|
173
|
-
|
174
|
-
= New Plugins
|
175
|
-
|
176
|
-
* A static_cache plugin has been added, allowing you to cache a model
|
177
|
-
statically. This plugin is useful for models whose tables do not
|
178
|
-
change while the application is running, such as lookup tables.
|
179
|
-
When using this plugin, the following methods will no longer require
|
180
|
-
queries:
|
181
|
-
|
182
|
-
* Primary key lookups (e.g. Model[1])
|
183
|
-
* Model.all calls
|
184
|
-
* Model.each calls
|
185
|
-
* Model.map calls without an argument
|
186
|
-
* Model.to_hash calls without an argument
|
187
|
-
|
188
|
-
The statically cached model instances are frozen so they are not
|
189
|
-
accidently modified.
|
190
|
-
|
191
|
-
* A many_to_one_pk_lookup plugin has been added that changes the
|
192
|
-
many_to_one association retrieval code to do a simple primary
|
193
|
-
key lookup on the associated class in most cases. This results
|
194
|
-
in significantly better performance, especially if the
|
195
|
-
associated model is using a caching plugin (either caching
|
196
|
-
or static_cache).
|
197
|
-
|
198
|
-
= Core Extension Replacements
|
199
|
-
|
200
|
-
* Most of Sequel's core extensions now have equivalent methods defined
|
201
|
-
on the Sequel module:
|
202
|
-
|
203
|
-
:column.as(:alias) -> Sequel.as(:column, :alias)
|
204
|
-
:column.asc -> Sequel.asc(:column)
|
205
|
-
:column.desc -> Sequel.desc(:column)
|
206
|
-
:column.cast(Integer) -> Sequel.cast(:column, Integer)
|
207
|
-
:column.cast_numeric -> Sequel.cast_numeric(:column)
|
208
|
-
:column.cast_string -> Sequel.cast_string(:column)
|
209
|
-
:column.extract(:year) -> Sequel.extract(:year, :column)
|
210
|
-
:column.identifier -> Sequel.identifier(:column)
|
211
|
-
:column.ilike('A%') -> Sequel.ilike(:column, 'A%')
|
212
|
-
:column.like('A%') -> Sequel.like(:column, 'A%')
|
213
|
-
:column.qualify(:table) -> Sequel.qualify(:table, :column)
|
214
|
-
:column.sql_subscript(1) -> Sequel.subscript(:column, 1)
|
215
|
-
:function.sql_function(1) -> Sequel.function(:function, 1)
|
216
|
-
'some SQL'.lit -> Sequel.lit('some SQL')
|
217
|
-
'string'.to_sequel_blob -> Sequel.blob('string')
|
218
|
-
{:a=>1}.case(0) -> Sequel.case({:a=>1}, 0)
|
219
|
-
{:a=>1}.sql_negate -> Sequel.negate(:a=>1)
|
220
|
-
{:a=>1}.sql_or -> Sequel.or(:a=>1)
|
221
|
-
[[1, 2]].sql_value_list -> Sequel.value_list([[1, 2]])
|
222
|
-
[:a, :b].sql_string_join -> Sequel.join([:a, :b])
|
223
|
-
~{:a=>1} -> Sequel.~(:a=>1)
|
224
|
-
:a + 1 -> Sequel.+(:a, 1)
|
225
|
-
:a - 1 -> Sequel.-(:a, 1)
|
226
|
-
:a * 1 -> Sequel.*(:a, 1)
|
227
|
-
:a / 1 -> Sequel./(:a, 1)
|
228
|
-
:a & 1 -> Sequel.&(:a, 1)
|
229
|
-
:a | 1 -> Sequel.|(:a, 1)
|
230
|
-
|
231
|
-
* You can now wrap any object in a Sequel expression using
|
232
|
-
Sequel.expr. This is similar to the sql_expr extension, but
|
233
|
-
without defining the sql_expr method on all objects:
|
234
|
-
|
235
|
-
1.sql_expr -> Sequel.expr(1)
|
236
|
-
|
237
|
-
The sql_expr extension now just has Object#sql_expr call
|
238
|
-
Sequel.expr.
|
239
|
-
|
240
|
-
* Virtual Rows now have methods defined that handle the standard
|
241
|
-
mathematical operators:
|
242
|
-
|
243
|
-
select{|o| o.+(1, :a)} # SELECT (1 + a)
|
244
|
-
|
245
|
-
the standard inequality operators:
|
246
|
-
|
247
|
-
where{|o| o.>(2, :a)} # WHERE (2 > a)
|
248
|
-
|
249
|
-
and the standard boolean operators:
|
250
|
-
|
251
|
-
where{|o| o.&({:a=>1}, o.~(:b=>1))} # WHERE ((a = 1) AND (b != 1))
|
252
|
-
|
253
|
-
Additionally, there is now direct support for creating literal
|
254
|
-
strings in instance_evaled virtual row blocks using `:
|
255
|
-
|
256
|
-
where{a > `some crazy SQL`} # WHERE (a > some crazy SQL)
|
257
|
-
|
258
|
-
This doesn't override Kernel.`, since virtual rows use a BasicObject
|
259
|
-
subclass. Previously, using ` would result in calling the SQL
|
260
|
-
function named ` with the given string, which probably isn't valid
|
261
|
-
syntax on most databases.
|
262
|
-
|
263
|
-
* You can now require 'sequel/no_core_ext' to load Sequel without the
|
264
|
-
core extensions. The previous way of setting the
|
265
|
-
SEQUEL_NO_CORE_EXTENSIONS constant or environment variable before
|
266
|
-
loading Sequel still works.
|
267
|
-
|
268
|
-
* The core extensions have been moved from Sequel's core library into
|
269
|
-
an extension that is loadable with Sequel.extension. This extension
|
270
|
-
is still loaded by default for backwards compatibility. However,
|
271
|
-
the next major version of Sequel will no longer load this extension
|
272
|
-
by default (though it will still be available to load manually).
|
273
|
-
|
274
|
-
* You can now check if the core extensions have been loaded by using
|
275
|
-
Sequel.core_extensions?.
|
276
|
-
|
277
|
-
= Foreign Keys in the Schema Dumper
|
278
|
-
|
279
|
-
* Database#foreign_key_list has been added that gives an array of
|
280
|
-
foreign key constraints on the table. It is currently implemented
|
281
|
-
on MySQL, PostgreSQL, and SQLite, and may be implemented on other
|
282
|
-
database types in the future. Each entry in the return array is
|
283
|
-
a hash, with at least the following keys present:
|
284
|
-
|
285
|
-
:columns :: An array of columns in the given table
|
286
|
-
:table :: The table referenced by the columns
|
287
|
-
:key :: An array of columns referenced (in the table specified by
|
288
|
-
:table), but can be nil on certain adapters if the primary
|
289
|
-
key is referenced.
|
290
|
-
|
291
|
-
The hash may also contain entries for:
|
292
|
-
|
293
|
-
:deferrable :: Whether the constraint is deferrable
|
294
|
-
:name :: The name of the constraint
|
295
|
-
:on_delete :: The action to take ON DELETE
|
296
|
-
:on_update :: The action to take ON UPDATE
|
297
|
-
|
298
|
-
* The schema_dumper extension now dumps foreign key constraints on
|
299
|
-
databases that support Database#foreign_key_list. On such
|
300
|
-
databases, dumping a schema migration will dump the tables in
|
301
|
-
topological order, such that referenced tables always come before
|
302
|
-
referencing tables.
|
303
|
-
|
304
|
-
In case there is a circular dependency, Sequel breaks the
|
305
|
-
dependency and adds separate foreign key constraints at the end
|
306
|
-
of the migration. However, when a circular dependency is broken,
|
307
|
-
the migration can probably not be migrated down.
|
308
|
-
|
309
|
-
Foreign key constraints can also be dumped as a separate migration
|
310
|
-
using Database#dump_foreign_key_migration, similar to how
|
311
|
-
Database#dump_indexes_migration works.
|
312
|
-
|
313
|
-
* When using bin/sequel -C to copy databases, foreign key constraints
|
314
|
-
are now copied if the source database supports
|
315
|
-
Database#foreign_key_list.
|
316
|
-
|
317
|
-
= Other New Features
|
318
|
-
|
319
|
-
* Dataset#to_hash_groups and #select_hash_groups have been added.
|
320
|
-
These methods are similar to #to_hash and #select_hash in that they
|
321
|
-
return a hash, but hashes returned by *_hash_groups methods have
|
322
|
-
arrays of all matching values, unlike the *_hash methods which
|
323
|
-
just use the last matching value. Example:
|
324
|
-
|
325
|
-
DB[:table].all
|
326
|
-
# => [{:a=>1, :b=>2}, {:a=>1, :b=>3}, {:a=>2, :b=>4}]
|
327
|
-
|
328
|
-
DB[:table].to_hash(:a, :b)
|
329
|
-
# => {1=>3, 2=>4}
|
330
|
-
|
331
|
-
DB[:table].to_hash_groups(:a, :b)
|
332
|
-
# => {1=>[2, 3], 2=>[4]}
|
333
|
-
|
334
|
-
* Model#set_fields and #update_fields now accept :missing=>:skip and
|
335
|
-
:missing=>:raise options, allowing them to be used in more cases.
|
336
|
-
:missing=>:skip skips missing entries in the hash, instead of
|
337
|
-
setting the field to the default hash value. :missing=>:raise
|
338
|
-
raises an error for missing fields, similar to
|
339
|
-
strict_param_setting = true. It's recommended that these options
|
340
|
-
be used in new code in preference to #set_only and #update_only.
|
341
|
-
|
342
|
-
* Database#drop_table? has been added, for dropping tables if they
|
343
|
-
already exist. This uses DROP TABLE IF EXISTS on the databases that
|
344
|
-
support it. Database#supports_drop_table_if_exists? has been added
|
345
|
-
for checking whether the database supports that syntax.
|
346
|
-
|
347
|
-
* Database#create_join_table has been added that allows easy
|
348
|
-
creation of many_to_many join tables:
|
349
|
-
|
350
|
-
DB.create_join_table(:album_id=>:albums, :artist_id=>:artists)
|
351
|
-
|
352
|
-
This uses real foreign keys for both of the columns, uses a
|
353
|
-
composite primary key of both of the columns, and adds an
|
354
|
-
additional composite index of the columns in reverse order. The
|
355
|
-
primary key and additional index should ensure that almost all
|
356
|
-
operations on the join table can benefit from an index.
|
357
|
-
|
358
|
-
In terms of customization, the values in the hash can be hashes
|
359
|
-
themselves for column specific options, and an additional options
|
360
|
-
hash can also be given to override some of the default settings.
|
361
|
-
|
362
|
-
Database#drop_join_table also exists and takes the same options
|
363
|
-
as create_join_table. It mostly exists to make it easy to
|
364
|
-
reverse migrations that use create_join_table.
|
365
|
-
|
366
|
-
* Model#freeze has been added that freezes a model such that it
|
367
|
-
works correctly in a read-only state. Before, it used the standard
|
368
|
-
Object#freeze, which broke some things that should work, and
|
369
|
-
allowed changes that shouldn't be allowed (like modifying the
|
370
|
-
instance's values).
|
371
|
-
|
372
|
-
* ConnectionPool#all_connections has been added, which yields each
|
373
|
-
available connection in the pool to the block. For threaded pools,
|
374
|
-
it does not yield connections that are currently being used by
|
375
|
-
other threads. When using this method, it is important to only
|
376
|
-
operate on the yielded connection objects, and not make any
|
377
|
-
modifications to the pool itself. The pool is also locked until
|
378
|
-
the method returns.
|
379
|
-
|
380
|
-
* ConnectionPool#after_connect= has been added, allowing you to
|
381
|
-
change a connection pool's after_connect proc after instantiating
|
382
|
-
the pool.
|
383
|
-
|
384
|
-
* ConnectionPool#disconnection_proc= has been added, allowing you to
|
385
|
-
change a connection pool's disconnection_proc after instantiating the
|
386
|
-
pool.
|
387
|
-
|
388
|
-
* A Model.cache_anonymous_models accessor has been added, and can be
|
389
|
-
set to false to disable the caching of classes created by
|
390
|
-
Sequel::Model(). This caching is only useful if you want to reload
|
391
|
-
the model's file without getting a superclass mismatch. This
|
392
|
-
setting is true by default for backwards compatibility, but may be
|
393
|
-
changed to false in a later version, so you should manually set it to
|
394
|
-
true if you are using code reloading.
|
395
|
-
|
396
|
-
* Model.instance_dataset has been added for getting the dataset used
|
397
|
-
for model instances (a naked dataset restricted to a single row).
|
398
|
-
|
399
|
-
* Dataset#with_sql_delete has been added for running the given SQL
|
400
|
-
string as a delete and returning the number of rows modified. It's
|
401
|
-
designed as a replacement for with_sql(sql).delete, which is slower
|
402
|
-
as it requires cloning the dataset.
|
403
|
-
|
404
|
-
* The :on_update and :on_delete entries for foreign_key now accept
|
405
|
-
string arguments which are used literally.
|
406
|
-
|
407
|
-
* Prepared statement objects now have a log_sql accessor that can be
|
408
|
-
turned on to log the entire SQL statement instead of just the
|
409
|
-
prepared statement name.
|
410
|
-
|
411
|
-
* Dataset#multi_replace has been added on MySQL. This is similar to
|
412
|
-
multi_insert, but uses REPLACE instead of INSERT.
|
413
|
-
|
414
|
-
* Dataset#explain has been added to MySQL. You can use an
|
415
|
-
:extended=>true option to use EXPLAIN EXTENDED.
|
416
|
-
|
417
|
-
* A Database#type_supported? method has been added on PostgreSQL to
|
418
|
-
check if the database supports the given type:
|
419
|
-
|
420
|
-
DB.type_supported?(:hstore)
|
421
|
-
|
422
|
-
* Datatabase#reset_conversion_procs has been added to the postgres
|
423
|
-
adapter, for use by extensions that modify the default conversion
|
424
|
-
procs and want to have the database use the updated defaults.
|
425
|
-
|
426
|
-
* A Database#convert_infinite_timestamps accessor has been added to
|
427
|
-
the postgres adapter, allowing you to return infinite timestamps as
|
428
|
-
nil, a string, or a float.
|
429
|
-
|
430
|
-
* SQL::PlaceholderLiteralString objects can now use a placeholder
|
431
|
-
array, where placeholder values are inserted between array elements.
|
432
|
-
This is about 2.5-3x faster than using a string with ? placeholders,
|
433
|
-
and allows usage of ? inside the array:
|
434
|
-
|
435
|
-
Sequel.lit(["(", " ? ", ")"], 1, 2) # (1 ? 2)
|
436
|
-
|
437
|
-
* SQL::Subscript#[] has been added for accessing members of a
|
438
|
-
multi-dimensional array:
|
439
|
-
|
440
|
-
Sequel.subscript(:column, 1)[2][3] # column[1][2][3]
|
441
|
-
|
442
|
-
* SQL::Wrapper has been added for wrapping arbitrary objects in a
|
443
|
-
Sequel expression object.
|
444
|
-
|
445
|
-
* SQL::QualifiedIdentifier objects can now contain arbitrary Sequel
|
446
|
-
expressions. Before, they could only contain a few expression
|
447
|
-
types. This makes it easier to add extensions to support
|
448
|
-
PostgreSQL row-valued types.
|
449
|
-
|
450
|
-
= Performance Improvements
|
451
|
-
|
452
|
-
* Model.[] when called with a primary key has been made about 110%
|
453
|
-
faster for most models by avoiding cloning datasets.
|
454
|
-
|
455
|
-
* Model.[] when called without arguments or with a single nil argument
|
456
|
-
is much faster as it now returns nil immediately instead of issuing
|
457
|
-
a database query.
|
458
|
-
|
459
|
-
* Model#delete and Model#destroy have been made about 75% faster for
|
460
|
-
most models by using a static SQL string.
|
461
|
-
|
462
|
-
* Model.new is now twice as fast when passed an empty hash.
|
463
|
-
|
464
|
-
* Model#set is now four times as fast when passed an empty hash.
|
465
|
-
|
466
|
-
* Model#this has been made about 85% faster by reducing the number of
|
467
|
-
dataset clones needed from 3 to 1.
|
468
|
-
|
469
|
-
* Some proc activations have been removed, giving minor speedups when
|
470
|
-
running on MRI.
|
471
|
-
|
472
|
-
= Other Improvements
|
473
|
-
|
474
|
-
* Database#uri and #url now return the connection string given
|
475
|
-
to Sequel.connect. Previously, they tried to reconstruct the
|
476
|
-
url using the database's options, but that didn't work well in
|
477
|
-
corner cases.
|
478
|
-
|
479
|
-
* Database#inspect now shows the URL and/or options given when
|
480
|
-
connecting to the database. Previously, it showed the URL, or
|
481
|
-
all of the databases options if constructing the URL raised an
|
482
|
-
error.
|
483
|
-
|
484
|
-
* Sequel no longer checks for prepared transactions support when
|
485
|
-
using transactions unless a prepared transaction is specifically
|
486
|
-
requested.
|
487
|
-
|
488
|
-
* The schema utility dataset cached in the Database object is now
|
489
|
-
reset if you use Database#extend_datasets, ensuring that the new
|
490
|
-
value will use the given extension.
|
491
|
-
|
492
|
-
* The prepared_statements* plugins now log the full SQL by default.
|
493
|
-
Since the user doesn't choose the name of the prepared statements,
|
494
|
-
it was often difficult to determine what SQL was actually run if
|
495
|
-
you were only looking at a subsection of the SQL log.
|
496
|
-
|
497
|
-
* The nested_attributes plugin's delete/remove support now works
|
498
|
-
correctly when a false value is given for _delete/_remove and
|
499
|
-
strict_param_setting is true.
|
500
|
-
|
501
|
-
* The hook_class_methods and validation_class_methods plugins
|
502
|
-
now work correctly when subclassing if the subclass attempts to
|
503
|
-
create instances inside Model.inherited.
|
504
|
-
|
505
|
-
* The caching plugin has been refactored. Model.cache_get_pk and
|
506
|
-
cache_delete_pk have been added for retrieving/deleting from the
|
507
|
-
cache by primary key. Model.cache_key is now a public method.
|
508
|
-
|
509
|
-
* The typecast_on_load plugin now works correctly when saving
|
510
|
-
new model objects when insert_select is supported.
|
511
|
-
|
512
|
-
* In the sql_expr extension, nil.sql_expr is no longer treated as
|
513
|
-
a boolean value. It is now treated as a value with generic type.
|
514
|
-
|
515
|
-
* The postgres adapter no longer issues a query to map type names to
|
516
|
-
type oids if no named conversion procs have been registered.
|
517
|
-
|
518
|
-
* The postgres adapter now works around issues in ruby-pg by
|
519
|
-
supporting fractional seconds for Time/DateTime values, and
|
520
|
-
supporting SQL::Blob (bytea) values with embedded "\0" characters.
|
521
|
-
|
522
|
-
* The postgres adapter now supports pre-defining the PG_NAMED_TYPES
|
523
|
-
and PG_TYPES constants. This is so extensions can define them,
|
524
|
-
so they don't have to load the postgres adapter file first. If
|
525
|
-
extensions need to use these constants, they should do:
|
526
|
-
|
527
|
-
PG_NAMED_TYPES = {} unless defined?(PG_NAMED_TYPES)
|
528
|
-
PG_TYPES = {} unless defined?(PG_TYPES)
|
529
|
-
|
530
|
-
That way they work whether they are loaded before or after the
|
531
|
-
postgres adapter.
|
532
|
-
|
533
|
-
* PostgreSQL 8.2-9.0 now correctly add the RETURNING clause when
|
534
|
-
building queries. Sequel 3.31.0 added support for returning values
|
535
|
-
from delete/update queries in PostgreSQL 8.2-9.0, but didn't change
|
536
|
-
the literalization code to use the RETURNING clause on those
|
537
|
-
versions.
|
538
|
-
|
539
|
-
* The jdbc/postgres adapter now converts Java arrays
|
540
|
-
(Java::OrgPostgresqlJdbc4::Jdbc4Array) to ruby arrays.
|
541
|
-
|
542
|
-
* Tables and schemas with embedded ' characters are now handled
|
543
|
-
correctly when parsing primary keys and sequences on PostgreSQL.
|
544
|
-
|
545
|
-
* Identifiers are now escaped on MySQL and SQLite. Previously they
|
546
|
-
were quoted, but internal ` characters were not doubled.
|
547
|
-
|
548
|
-
* Fractional seconds for the time type are now returned correctly on
|
549
|
-
jdbc (assuming they are returned as java.sql.Time values by JDBC).
|
550
|
-
|
551
|
-
* Multiple changes were made to ensure that Sequel works correctly
|
552
|
-
when the core extensions are not loaded.
|
553
|
-
|
554
|
-
* Composite foreign key constraints are now retained when emulating
|
555
|
-
alter_table operations on SQLite. Previously, only single
|
556
|
-
foreign key constraints were retained.
|
557
|
-
|
558
|
-
* An error is no longer raised when no indexes exist when calling
|
559
|
-
Database#indexes on jdbc/sqlite.
|
560
|
-
|
561
|
-
* A possible SystemStackError has been fixed in the SQLite adapter,
|
562
|
-
when trying to delete a dataset that uses a having clause and no
|
563
|
-
where clause.
|
564
|
-
|
565
|
-
* ROLLUP/CUBE support now works correctly on Microsoft SQL Server
|
566
|
-
2005.
|
567
|
-
|
568
|
-
* Unsigned tinyint types are now recognized in the schema dumper.
|
569
|
-
|
570
|
-
* Using primary_key :column, :type=>Bignum now works correctly on H2.
|
571
|
-
Previously, the column created was not autoincrementing.
|
572
|
-
|
573
|
-
* Using a bound variable for a limit is now supported in the ibmdb
|
574
|
-
adapter on ruby 1.9.
|
575
|
-
|
576
|
-
* Connecting to PostgreSQL via the swift adapter has been fixed when
|
577
|
-
using newer versions of swift.
|
578
|
-
|
579
|
-
* The mock adapter now handles calling the Database#execute methods
|
580
|
-
directly (instead of via a dataset).
|
581
|
-
|
582
|
-
* The mock adapter now has the ability to have per-shared adapter
|
583
|
-
specific initialization code executed. This has been used to fix
|
584
|
-
some bugs when using the shared postgres adapter.
|
585
|
-
|
586
|
-
* The pretty_table extension has been split into two extensions, one
|
587
|
-
that adds a method to Dataset and one that just adds the
|
588
|
-
PrettyTable class. Also, PrettyTable.string has been added to get
|
589
|
-
a string copy of the table.
|
590
|
-
|
591
|
-
* A spec_model_no_assoc task has been added for running model specs
|
592
|
-
without the association plugin loaded. This is to check that the
|
593
|
-
SEQUEL_NO_ASSOCIATIONS setting works correctly.
|
594
|
-
|
595
|
-
= Deprecated Features to be Removed in Sequel 3.35.0
|
596
|
-
|
597
|
-
* Ruby <1.8.7 support is now deprecated.
|
598
|
-
|
599
|
-
* PostgreSQL <8.2 support is now deprecated.
|
600
|
-
|
601
|
-
* Dataset#disable_insert_returning on PostgreSQL is now deprecated.
|
602
|
-
Starting in 3.35.0, RETURNING will now always be used to get the
|
603
|
-
primary key value when inserting.
|
604
|
-
|
605
|
-
* Array#all_two_pairs? is now deprecated. It was part of the core
|
606
|
-
extensions, but the core extensions have been refactored to no
|
607
|
-
longer require it. As it doesn't specifically relate to creating
|
608
|
-
Sequel expression objects, it is being removed. The private
|
609
|
-
Array#sql_expr_if_all_two_pairs method is deprecated as well.
|
610
|
-
|
611
|
-
= Other Backwards Compatibility Issues
|
612
|
-
|
613
|
-
* The generic Bignum type now uses bigint on SQLite, similar to
|
614
|
-
other databases. The integer type was previously used. The only
|
615
|
-
exception is for auto incrementing primary keys, which still use
|
616
|
-
integer for Bignum as SQLite doesn't support autoincrementing
|
617
|
-
columns other than integer.
|
618
|
-
|
619
|
-
* On SQLite, Dataset#explain now returns a string, similar to
|
620
|
-
PostgreSQL (and now MySQL).
|
621
|
-
|
622
|
-
* When using the JDBC adapter, Java::OrgPostgresqlUtil::PGobject
|
623
|
-
objects are converted to ruby strings if the dataset is set to
|
624
|
-
convert types (the default setting). This is to support the
|
625
|
-
hstore extension, but it could have unforeseen effects if custom
|
626
|
-
types were used.
|
627
|
-
|
628
|
-
* For PostgreSQL connection objects, #primary_key and #sequence now
|
629
|
-
require their arguments are provided as already literalized
|
630
|
-
strings. Note that these methods are being removed in the next
|
631
|
-
version because they will not be needed after PostgreSQL <8.2
|
632
|
-
support is dropped.
|
633
|
-
|
634
|
-
* Database#uri and #url now return a string or nil, but never raise
|
635
|
-
an exception. Previously, they would either return a string
|
636
|
-
or raise an exception.
|
637
|
-
|
638
|
-
* The Model @simple_pk and @simple_table instance variables should
|
639
|
-
no longer be modified directly. Instead, the setter methods should
|
640
|
-
be used.
|
641
|
-
|
642
|
-
* Model.primary_key_lookup should no longer be called with a nil
|
643
|
-
value.
|
644
|
-
|
645
|
-
* Logging of prepared statements on some adapters has been changed
|
646
|
-
slightly, so log parsers might need to be updated.
|
647
|
-
|
648
|
-
* Dataset#identifier_append and #table_ref_append no longer treat
|
649
|
-
literal strings and blobs specially. Previously, they were treated
|
650
|
-
as identifiers.
|
651
|
-
|
652
|
-
* Dataset#qualified_identifier_sql_append now takes 3 arguments, so
|
653
|
-
any extensions that override it should be modified accordingly.
|
654
|
-
|
655
|
-
* Some internally used constants and private methods have been
|
656
|
-
deleted:
|
657
|
-
|
658
|
-
Database::CASCADE
|
659
|
-
Database::NO_ACTION
|
660
|
-
Database::SET_DEFAULTS
|
661
|
-
Database::SET_NULL
|
662
|
-
Database::RESTRICT
|
663
|
-
Dataset::COLUMN_ALL
|
664
|
-
|
665
|
-
or moved:
|
666
|
-
|
667
|
-
MySQL::Dataset::AFFECTED_ROWS_RE -> MySQL::Database
|
668
|
-
MySQL::Dataset#affected_rows -> MySQL::Database
|
669
|
-
|
670
|
-
* The sql_expr extension no longer creates the
|
671
|
-
Sequel::SQL::GenericComplexExpression class.
|