sequel 5.58.0 → 5.78.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +288 -0
- data/MIT-LICENSE +1 -1
- data/README.rdoc +24 -23
- data/bin/sequel +11 -3
- data/doc/advanced_associations.rdoc +16 -14
- data/doc/association_basics.rdoc +53 -17
- data/doc/cheat_sheet.rdoc +3 -3
- data/doc/mass_assignment.rdoc +1 -1
- data/doc/migration.rdoc +15 -0
- data/doc/model_hooks.rdoc +1 -1
- data/doc/object_model.rdoc +8 -8
- data/doc/opening_databases.rdoc +20 -12
- data/doc/postgresql.rdoc +8 -8
- data/doc/querying.rdoc +1 -1
- data/doc/release_notes/5.59.0.txt +73 -0
- data/doc/release_notes/5.60.0.txt +22 -0
- data/doc/release_notes/5.61.0.txt +43 -0
- data/doc/release_notes/5.62.0.txt +132 -0
- data/doc/release_notes/5.63.0.txt +33 -0
- data/doc/release_notes/5.64.0.txt +50 -0
- data/doc/release_notes/5.65.0.txt +21 -0
- data/doc/release_notes/5.66.0.txt +24 -0
- data/doc/release_notes/5.67.0.txt +32 -0
- data/doc/release_notes/5.68.0.txt +61 -0
- data/doc/release_notes/5.69.0.txt +26 -0
- data/doc/release_notes/5.70.0.txt +35 -0
- data/doc/release_notes/5.71.0.txt +21 -0
- data/doc/release_notes/5.72.0.txt +33 -0
- data/doc/release_notes/5.73.0.txt +66 -0
- data/doc/release_notes/5.74.0.txt +45 -0
- data/doc/release_notes/5.75.0.txt +35 -0
- data/doc/release_notes/5.76.0.txt +86 -0
- data/doc/release_notes/5.77.0.txt +63 -0
- data/doc/release_notes/5.78.0.txt +67 -0
- data/doc/schema_modification.rdoc +3 -3
- data/doc/security.rdoc +9 -9
- data/doc/sharding.rdoc +3 -1
- data/doc/sql.rdoc +14 -14
- data/doc/testing.rdoc +16 -12
- data/doc/transactions.rdoc +6 -6
- data/doc/virtual_rows.rdoc +1 -1
- data/lib/sequel/adapters/ibmdb.rb +1 -1
- data/lib/sequel/adapters/jdbc/h2.rb +3 -0
- data/lib/sequel/adapters/jdbc/hsqldb.rb +2 -0
- data/lib/sequel/adapters/jdbc/postgresql.rb +3 -0
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +15 -0
- data/lib/sequel/adapters/jdbc/sqlserver.rb +4 -0
- data/lib/sequel/adapters/jdbc.rb +10 -6
- data/lib/sequel/adapters/mysql.rb +19 -7
- data/lib/sequel/adapters/mysql2.rb +2 -2
- data/lib/sequel/adapters/odbc/mssql.rb +1 -1
- data/lib/sequel/adapters/oracle.rb +1 -0
- data/lib/sequel/adapters/postgres.rb +62 -16
- data/lib/sequel/adapters/shared/access.rb +9 -1
- data/lib/sequel/adapters/shared/db2.rb +12 -0
- data/lib/sequel/adapters/shared/mssql.rb +71 -9
- data/lib/sequel/adapters/shared/mysql.rb +80 -1
- data/lib/sequel/adapters/shared/oracle.rb +17 -7
- data/lib/sequel/adapters/shared/postgres.rb +494 -164
- data/lib/sequel/adapters/shared/sqlanywhere.rb +18 -5
- data/lib/sequel/adapters/shared/sqlite.rb +40 -4
- data/lib/sequel/adapters/sqlite.rb +42 -3
- data/lib/sequel/adapters/trilogy.rb +117 -0
- data/lib/sequel/connection_pool/sharded_threaded.rb +16 -11
- data/lib/sequel/connection_pool/sharded_timed_queue.rb +374 -0
- data/lib/sequel/connection_pool/threaded.rb +14 -8
- data/lib/sequel/connection_pool/timed_queue.rb +270 -0
- data/lib/sequel/connection_pool.rb +57 -31
- data/lib/sequel/database/connecting.rb +25 -1
- data/lib/sequel/database/dataset.rb +16 -6
- data/lib/sequel/database/misc.rb +65 -14
- data/lib/sequel/database/query.rb +72 -1
- data/lib/sequel/database/schema_generator.rb +2 -1
- data/lib/sequel/database/schema_methods.rb +13 -3
- data/lib/sequel/database/transactions.rb +6 -0
- data/lib/sequel/dataset/actions.rb +60 -13
- data/lib/sequel/dataset/deprecated_singleton_class_methods.rb +42 -0
- data/lib/sequel/dataset/features.rb +15 -1
- data/lib/sequel/dataset/misc.rb +12 -2
- data/lib/sequel/dataset/placeholder_literalizer.rb +20 -9
- data/lib/sequel/dataset/query.rb +62 -37
- data/lib/sequel/dataset/sql.rb +58 -36
- data/lib/sequel/dataset.rb +4 -0
- data/lib/sequel/exceptions.rb +5 -0
- data/lib/sequel/extensions/_model_pg_row.rb +0 -12
- data/lib/sequel/extensions/_pretty_table.rb +1 -1
- data/lib/sequel/extensions/any_not_empty.rb +2 -2
- data/lib/sequel/extensions/async_thread_pool.rb +21 -13
- data/lib/sequel/extensions/auto_cast_date_and_time.rb +94 -0
- data/lib/sequel/extensions/auto_literal_strings.rb +1 -1
- data/lib/sequel/extensions/connection_expiration.rb +15 -9
- data/lib/sequel/extensions/connection_validator.rb +16 -11
- data/lib/sequel/extensions/constraint_validations.rb +1 -1
- data/lib/sequel/extensions/date_arithmetic.rb +36 -8
- data/lib/sequel/extensions/duplicate_columns_handler.rb +10 -9
- data/lib/sequel/extensions/index_caching.rb +5 -1
- data/lib/sequel/extensions/is_distinct_from.rb +3 -1
- data/lib/sequel/extensions/looser_typecasting.rb +3 -0
- data/lib/sequel/extensions/migration.rb +65 -15
- data/lib/sequel/extensions/named_timezones.rb +22 -6
- data/lib/sequel/extensions/pg_array.rb +33 -4
- data/lib/sequel/extensions/pg_auto_parameterize.rb +509 -0
- data/lib/sequel/extensions/pg_auto_parameterize_in_array.rb +110 -0
- data/lib/sequel/extensions/pg_enum.rb +1 -2
- data/lib/sequel/extensions/pg_extended_date_support.rb +38 -27
- data/lib/sequel/extensions/pg_extended_integer_support.rb +116 -0
- data/lib/sequel/extensions/pg_hstore.rb +5 -0
- data/lib/sequel/extensions/pg_inet.rb +10 -11
- data/lib/sequel/extensions/pg_interval.rb +10 -11
- data/lib/sequel/extensions/pg_json.rb +10 -10
- data/lib/sequel/extensions/pg_json_ops.rb +52 -0
- data/lib/sequel/extensions/pg_multirange.rb +6 -11
- data/lib/sequel/extensions/pg_range.rb +9 -14
- data/lib/sequel/extensions/pg_row.rb +20 -19
- data/lib/sequel/extensions/pg_timestamptz.rb +27 -3
- data/lib/sequel/extensions/round_timestamps.rb +1 -1
- data/lib/sequel/extensions/schema_caching.rb +1 -1
- data/lib/sequel/extensions/schema_dumper.rb +32 -9
- data/lib/sequel/extensions/server_block.rb +2 -1
- data/lib/sequel/extensions/set_literalizer.rb +58 -0
- data/lib/sequel/extensions/sqlite_json_ops.rb +76 -18
- data/lib/sequel/extensions/symbol_aref.rb +2 -0
- data/lib/sequel/extensions/transaction_connection_validator.rb +78 -0
- data/lib/sequel/model/associations.rb +50 -11
- data/lib/sequel/model/base.rb +45 -21
- data/lib/sequel/model/dataset_module.rb +3 -0
- data/lib/sequel/model/exceptions.rb +15 -3
- data/lib/sequel/plugins/auto_validations.rb +53 -15
- data/lib/sequel/plugins/class_table_inheritance.rb +2 -2
- data/lib/sequel/plugins/column_encryption.rb +27 -6
- data/lib/sequel/plugins/composition.rb +2 -2
- data/lib/sequel/plugins/concurrent_eager_loading.rb +4 -4
- data/lib/sequel/plugins/constraint_validations.rb +8 -5
- data/lib/sequel/plugins/defaults_setter.rb +16 -0
- data/lib/sequel/plugins/dirty.rb +1 -1
- data/lib/sequel/plugins/finder.rb +4 -2
- data/lib/sequel/plugins/list.rb +8 -3
- data/lib/sequel/plugins/many_through_many.rb +1 -1
- data/lib/sequel/plugins/mssql_optimistic_locking.rb +8 -38
- data/lib/sequel/plugins/nested_attributes.rb +4 -4
- data/lib/sequel/plugins/optimistic_locking.rb +9 -42
- data/lib/sequel/plugins/optimistic_locking_base.rb +55 -0
- data/lib/sequel/plugins/paged_operations.rb +181 -0
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +9 -3
- data/lib/sequel/plugins/pg_xmin_optimistic_locking.rb +109 -0
- data/lib/sequel/plugins/prepared_statements.rb +2 -1
- data/lib/sequel/plugins/prepared_statements_safe.rb +2 -1
- data/lib/sequel/plugins/primary_key_lookup_check_values.rb +154 -0
- data/lib/sequel/plugins/rcte_tree.rb +7 -4
- data/lib/sequel/plugins/require_valid_schema.rb +67 -0
- data/lib/sequel/plugins/single_table_inheritance.rb +8 -0
- data/lib/sequel/plugins/sql_comments.rb +5 -5
- data/lib/sequel/plugins/static_cache.rb +38 -0
- data/lib/sequel/plugins/static_cache_cache.rb +5 -1
- data/lib/sequel/plugins/tactical_eager_loading.rb +21 -14
- data/lib/sequel/plugins/validate_associated.rb +22 -12
- data/lib/sequel/plugins/validation_helpers.rb +29 -2
- data/lib/sequel/plugins/validation_helpers_generic_type_messages.rb +73 -0
- data/lib/sequel/version.rb +1 -1
- metadata +76 -6
@@ -0,0 +1,132 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* The pg_auto_parameterize extension for automatically using bound
|
4
|
+
variables when using postgres adapter with the pg driver has been
|
5
|
+
added back to Sequel. This extension was originally added in Sequel
|
6
|
+
3.34.0, but was removed in 4.0.0 due to the many corner cases it
|
7
|
+
had. Almost all of the corner cases have now been fixed, and
|
8
|
+
the extension is now recommended for production use. Compared
|
9
|
+
to the original version in Sequel 3, the reintroduced version
|
10
|
+
of the extension includes the following changes:
|
11
|
+
|
12
|
+
* Handles integers used in LIMIT/ORDER
|
13
|
+
* Respects explicit CASTs
|
14
|
+
* Tries to convert column IN (int, ...) into column = ANY($) with an
|
15
|
+
array parameter
|
16
|
+
* Uses the same parameter for the same object used more than once in
|
17
|
+
a query
|
18
|
+
* Uses parameters when inserting multiple rows via Dataset#import
|
19
|
+
* Supports automatically parameterizing all of the
|
20
|
+
PostgreSQL-specific types that Sequel ships support for in pg_*
|
21
|
+
extensions (though some values of those types may not support
|
22
|
+
automatic parameterization).
|
23
|
+
* Supports skipping auto parameterization for specific values.
|
24
|
+
|
25
|
+
Automatic parameterization is generally slower than Sequel's default
|
26
|
+
behavior, since some optimizations Sequel uses by default do not
|
27
|
+
currently support automatic parameterization.
|
28
|
+
|
29
|
+
Applications may need changes to work correctly with the
|
30
|
+
pg_auto_parameterize extension, such as the addition of explicit
|
31
|
+
casts. Please read the extension documentation for more details.
|
32
|
+
|
33
|
+
* Integer column schema entries now include :min_value and :max_value
|
34
|
+
entries on most databases, indicating the minimum and maximum values
|
35
|
+
supported for the column.
|
36
|
+
|
37
|
+
The validation_helpers plugin now has validates_max_value and
|
38
|
+
validates_min_value for testing the column value is not greater
|
39
|
+
than the given maximum value and not less than the given minimum
|
40
|
+
value, respectively.
|
41
|
+
|
42
|
+
The auto_validations plugin now automatically uses the :min_value
|
43
|
+
and :max_value column schema entries with the new validation_helpers
|
44
|
+
methods to validate that the column values for integer columns are
|
45
|
+
in the allowed range.
|
46
|
+
|
47
|
+
* A primary_key_lookup_check_values plugin has been added for
|
48
|
+
automatically typecasting and checking the primary key values are
|
49
|
+
in the allowed range (given by :min_value and :max_value column
|
50
|
+
schema entries) during lookup. If typecasting fails or the value
|
51
|
+
is outside the allowed range, the primary key lookup will return
|
52
|
+
nil without issuing a query (or will raise a NoMatchingRow error
|
53
|
+
if using with_pk!).
|
54
|
+
|
55
|
+
Note that this can change behavior in some cases if you are
|
56
|
+
passing filter conditions during lookup instead of passing primary
|
57
|
+
key values. The plugin tries to support most common filter
|
58
|
+
conditions, but there are still cases that will break.
|
59
|
+
|
60
|
+
* Sequel now supports shard-specific :after_connect and :connect_sqls
|
61
|
+
Database options, allowing you to customize behavior for specific
|
62
|
+
shards:
|
63
|
+
|
64
|
+
DB = Sequel.connect('url', servers: {
|
65
|
+
:shard1 => {host: '...', after_connect: proc{|conn|}},
|
66
|
+
:shard2 => {host: '...', connect_sqls: ['...']},
|
67
|
+
})
|
68
|
+
|
69
|
+
Note that these shard-specific options will not be respected if you
|
70
|
+
are calling after_connect= or connect_sqls= on the Database's
|
71
|
+
connection pool.
|
72
|
+
|
73
|
+
= Other Improvements
|
74
|
+
|
75
|
+
* A Sequel::Postgres::IntegerOutsideBigintRange exception will now be
|
76
|
+
raised if trying to literalize an integer outside PostgreSQL bigint
|
77
|
+
range, to avoid PostgreSQL treating the integer as a numeric type
|
78
|
+
and not respecting indexes on the related column.
|
79
|
+
|
80
|
+
A pg_extended_integer_support extension has been added for
|
81
|
+
customizing the behavior when literalizing an integer outside
|
82
|
+
PostgreSQL bigint range, either quoting it or getting the
|
83
|
+
historical behavior of using it directly in the query.
|
84
|
+
|
85
|
+
* Dataset#import and #multi_insert no longer use transactions when
|
86
|
+
they only run a single query.
|
87
|
+
|
88
|
+
* Fractional seconds in timestamps are now respected in the
|
89
|
+
named_timezones extension.
|
90
|
+
|
91
|
+
* Using hstore[] types as bound variables now works on PostgreSQL.
|
92
|
+
|
93
|
+
* Using BC dates and timestamps in bound variables now works on
|
94
|
+
PostgreSQL.
|
95
|
+
|
96
|
+
* A corner case has been fixed in eager loading where the window
|
97
|
+
function eager limit strategy would be used without removing the
|
98
|
+
row_number entries from the result.
|
99
|
+
|
100
|
+
* The shared postgres adapter now caches reflection datasets, speeding
|
101
|
+
up Database#indexes and similar methods.
|
102
|
+
|
103
|
+
* The mock postgres adapter now assumes PostgreSQL 15 instead of
|
104
|
+
PostgreSQL 14 by default.
|
105
|
+
|
106
|
+
= Backwards Compatibility
|
107
|
+
|
108
|
+
* If you are using Ruby integers outside PostgreSQL bigint range when
|
109
|
+
dealing with PostgreSQL numeric column values, this version may
|
110
|
+
not be compatible. It is recommended you explicitly convert the
|
111
|
+
Ruby integers to BigDecimal objects if you are using them for
|
112
|
+
numeric column values. You can also use the
|
113
|
+
pg_extended_integer_support extension introduced in this version.
|
114
|
+
|
115
|
+
= Workaround for Older Versions
|
116
|
+
|
117
|
+
* If you cannot upgrade to Sequel 5.62.0, but still want to avoid the
|
118
|
+
problems that come from using literal large integers on PostgreSQL,
|
119
|
+
you can use the following code, where DB is your Sequel::Database
|
120
|
+
object:
|
121
|
+
|
122
|
+
DB.extend_datasets do
|
123
|
+
def literal_integer(v)
|
124
|
+
if v > 9223372036854775807 || v < -9223372036854775808
|
125
|
+
raise Sequel::InvalidValue, "PostgreSQL int too large: #{v}"
|
126
|
+
end
|
127
|
+
super
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
This workaround should work all the way back to Sequel 3.29.0,
|
132
|
+
released in November 2011.
|
@@ -0,0 +1,33 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* On Ruby 3.2, the pool_class: :timed_queue Database option can now
|
4
|
+
be used to use an alternative connection pool that stores
|
5
|
+
connections in a queue, and uses the new Queue#pop :timeout option
|
6
|
+
in Ruby 3.2 to implement the pool timeout. This new connection
|
7
|
+
pool is simpler than the default connection pool. It is not yet
|
8
|
+
the default connection pool on Ruby 3.2, but it may become the
|
9
|
+
default in a later version. Users of Ruby 3.2 are encouraged to
|
10
|
+
try out the pool_class: :timed_queue Database option and provide
|
11
|
+
feedback on how it works in their application.
|
12
|
+
|
13
|
+
= Other Improvements
|
14
|
+
|
15
|
+
* The tactical_eager_loading plugin now works in combination with the
|
16
|
+
single_table_inheritance and class_table_inheritance plugins, when
|
17
|
+
loading an association only defined in a specific subclass.
|
18
|
+
Previously, eager loading would be skipped in such a case. Now,
|
19
|
+
an eager load will be attempted for all instances supporting the
|
20
|
+
association.
|
21
|
+
|
22
|
+
* The validate_associated plugin now avoids database type errors for
|
23
|
+
non-integer association keys. In cases where the associated object
|
24
|
+
doesn't have a value for the associated key, and the current object
|
25
|
+
does not have a key value that can be set in the associated object,
|
26
|
+
validation errors in the associated object related to the associated
|
27
|
+
key will be ignored.
|
28
|
+
|
29
|
+
* Thread-keyed connection pool hashes now use compare_by_identity for
|
30
|
+
better performance.
|
31
|
+
|
32
|
+
* The JRuby workaround in the named_timezones extension is no longer
|
33
|
+
used on JRuby 9.3.9.0+, as JRuby fixed the related bug.
|
@@ -0,0 +1,50 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* A :graph_use_association_block association option has been added,
|
4
|
+
which makes eager_graph use the association block (as eager does),
|
5
|
+
generally resulting in a JOIN to a subquery:
|
6
|
+
|
7
|
+
Artist.one_to_many :tracks, graph_use_association_block: true do |ds|
|
8
|
+
ds.where(foo: 3)
|
9
|
+
end
|
10
|
+
Artist.eager_graph(:tracks)
|
11
|
+
# SELECT albums.id, tracks.id AS tracks_id, tracks.album_id
|
12
|
+
# FROM albums
|
13
|
+
# LEFT OUTER JOIN (SELECT * FROM tracks WHERE (foo = 3)) AS tracks
|
14
|
+
# ON (tracks.album_id = albums.id)
|
15
|
+
|
16
|
+
Assuming that the database can optimize the query correctly, using
|
17
|
+
the :graph_use_association_block option is probably simpler than
|
18
|
+
than using other :graph_* options to duplicate the conditions added
|
19
|
+
by the association block.
|
20
|
+
|
21
|
+
* Numeric/Decimal column schema entries now include :min_value and
|
22
|
+
:max_value entries on most databases, indicating the minimum and
|
23
|
+
maximum values supported for the column. Similar to the support
|
24
|
+
for integer columns added in 5.62.0, this allows the
|
25
|
+
auto_validations plugin to automatically validate the values of
|
26
|
+
the columns are in the allowed range.
|
27
|
+
|
28
|
+
= Other Improvements
|
29
|
+
|
30
|
+
* many_through_{one,many} associations now support eager_graph
|
31
|
+
callbacks.
|
32
|
+
|
33
|
+
* The :db_type column schema entries on SQLAnywhere now include
|
34
|
+
precision/scale information, to work with the numeric/decimal
|
35
|
+
column min_value/max_value support.
|
36
|
+
|
37
|
+
* The oracle adapter now includes a :column_size column schema
|
38
|
+
entry containing the precision of the columns, to work with the
|
39
|
+
numeric/decimal column min_value/max_value support.
|
40
|
+
|
41
|
+
= Backwards Compatibility
|
42
|
+
|
43
|
+
* The private Database#column_schema_integer_min_max_values method
|
44
|
+
added in 5.62.0 now takes a column schema hash instead of a
|
45
|
+
database type string.
|
46
|
+
|
47
|
+
* Code that previously looked at the :db_type column schema entry on
|
48
|
+
SQLAnywhere should be updated to look at the :domain_name entry, and
|
49
|
+
code that looked at the :domain_name_with_size entry should be
|
50
|
+
updated to look at the :db_type entry.
|
@@ -0,0 +1,21 @@
|
|
1
|
+
= Improvements
|
2
|
+
|
3
|
+
* The pg_auto_parameterize extension now uses a modified placeholder
|
4
|
+
literalizer for speeding up the generation of SQL queries in the same
|
5
|
+
cases where a standard dataset would use a placeholder literalizer.
|
6
|
+
This can provide a 4% speedup for simple queries, with greater
|
7
|
+
speedups for more complex queries.
|
8
|
+
|
9
|
+
* Database#indexes now returns indexes for partitioned tables on
|
10
|
+
PostgreSQL 11+.
|
11
|
+
|
12
|
+
* MySQL versions not supporting CHECK constraints no longer include
|
13
|
+
:min_value/:max_value schema entries for decimal/numeric columns.
|
14
|
+
|
15
|
+
= Backwards Compatibility
|
16
|
+
|
17
|
+
* The Dataset::PlaceholderLiterlizer::Record.loader API has changed,
|
18
|
+
it now accepts the Dataset::PlaceholderLiterlizer class to use as
|
19
|
+
the first argument. This makes it easier to create
|
20
|
+
Dataset::PlaceholderLiterlizer subclasses, such as the one now used
|
21
|
+
by the pg_auto_parameterize extension.
|
@@ -0,0 +1,24 @@
|
|
1
|
+
= Improvements
|
2
|
+
|
3
|
+
* Dataset#empty? now correctly handles datasets using custom SQL or
|
4
|
+
Dataset#values where the first value in the first row is NULL.
|
5
|
+
|
6
|
+
* Dataset#count without an argument or block now works correctly on
|
7
|
+
Microsoft SQL Server when using custom SQL that uses ORDER BY.
|
8
|
+
|
9
|
+
* Dataset#count now works correctly for datasets using Dataset#values.
|
10
|
+
|
11
|
+
* Sequel now recognizes an additional SQLite constraint violation
|
12
|
+
error that occurs with recent versions of amalgalite.
|
13
|
+
|
14
|
+
* Dataset#values will now raise an exception when called with an empty
|
15
|
+
array. Previously, an exception would not be raised until the query
|
16
|
+
was sent to the database.
|
17
|
+
|
18
|
+
= Backwards Compatibility
|
19
|
+
|
20
|
+
* The changes to make Dataset#empty? and #count work with custom SQL
|
21
|
+
on Microsoft SQL Server now result in running the custom SQL, which
|
22
|
+
could result in worse performance than in previous versions. You can
|
23
|
+
wrap such datasets with Dataset#from_self manually to restore the
|
24
|
+
previous behavior.
|
@@ -0,0 +1,32 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* A set_literalizer extension has been added, for treating Set
|
4
|
+
instances in datasets similar to Array instances:
|
5
|
+
|
6
|
+
DB.extension :set_literalizer
|
7
|
+
DB[:table].where(column: Set.new([1, 2, 3]))
|
8
|
+
# SELECT FROM table WHERE (column IN (1, 2, 3))
|
9
|
+
|
10
|
+
= Improvements
|
11
|
+
|
12
|
+
* Sequel now avoids the use of singleton classes for datasets on Ruby
|
13
|
+
2.4+, instead creating a regular subclass whenever a dataset would
|
14
|
+
be extended via #extension or #with_extend. This significantly
|
15
|
+
improves performance, up to 20-40% for common dataset usage,
|
16
|
+
because it avoids creating new singleton classes for every dataset
|
17
|
+
clone, and it allows for cached method lookup.
|
18
|
+
|
19
|
+
* Database#tables and #views now support a :qualify option on Microsoft
|
20
|
+
SQL Server to returned qualified identifiers.
|
21
|
+
|
22
|
+
* The schema_dumper extension can now dump tables in non-default schemas
|
23
|
+
when using Microsoft SQL Server.
|
24
|
+
|
25
|
+
* The schema_dumper extension now correctly dumps string column sizes
|
26
|
+
when using Microsoft SQL Server.
|
27
|
+
|
28
|
+
= Backwards Compatibility
|
29
|
+
|
30
|
+
* Calling Sequel::Dataset.register_extension where the second argument
|
31
|
+
is not a module now issues a deprecation warning. Support for this
|
32
|
+
will be removed in Sequel 6.
|
@@ -0,0 +1,61 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* On PostgreSQL 9.6+, date, timestamp, and timestamptz columns now
|
4
|
+
have min_value and max_value column schema entries, allowing the
|
5
|
+
auto_validations plugin to automatically enforce minimum and
|
6
|
+
maximum values for these column types, raising a validation error
|
7
|
+
before saving, instead of database error when the query is sent
|
8
|
+
to the database.
|
9
|
+
|
10
|
+
* A validation_helpers_generic_type_messages plugin has been added,
|
11
|
+
which improves the default type validation error messages in
|
12
|
+
validation_helpers. This change was not made directly to
|
13
|
+
validation_helpers for backwards compatibility reasons, but will
|
14
|
+
probably become the default behavior in Sequel 6. Some examples
|
15
|
+
of the improvements:
|
16
|
+
|
17
|
+
# :blob type
|
18
|
+
# validation_helpers default: "value is not a valid sequel::sql::blob"
|
19
|
+
# with this plugin: "value is not a blob"
|
20
|
+
|
21
|
+
# :boolean type
|
22
|
+
# validation_helpers default: "value is not a valid trueclass or falseclass"
|
23
|
+
# with this plugin: "value is not true or false"
|
24
|
+
|
25
|
+
# :datetime type
|
26
|
+
# validation_helpers default: "value is not a valid time or datetime"
|
27
|
+
# with this plugin: "value is not a valid timestamp"
|
28
|
+
|
29
|
+
# custom/database-specific types
|
30
|
+
# validation_helpers default: "value is not a valid sequel::class_name"
|
31
|
+
# with this plugin: "value is not the expected type"
|
32
|
+
|
33
|
+
= Improvements
|
34
|
+
|
35
|
+
* The constraint_validations plugin no longer raises validation
|
36
|
+
errors for missing columns that have a default value. If a column
|
37
|
+
is missing but has a default value, we can assume the default
|
38
|
+
value is valid. Additionally, the constraint validations are now
|
39
|
+
based on the underlying column value and not any deserialized
|
40
|
+
value, so that the validation matches the constraint.
|
41
|
+
|
42
|
+
* On PostgreSQL, normal type name parsing is skipped for enum,
|
43
|
+
array, composite, range, and multirange types, ensuring that
|
44
|
+
such types will not be treated incorrectly based on their
|
45
|
+
type name.
|
46
|
+
|
47
|
+
* The pg_extended_date_support extension now works correctly with
|
48
|
+
the jdbc/postgresql adapter if there is already an entry in the
|
49
|
+
oid_convertor_map for the timestamp and timestamptz types.
|
50
|
+
|
51
|
+
= Backwards Compatibility
|
52
|
+
|
53
|
+
* Database#schema_column_type is no longer called for all columns
|
54
|
+
on PostgreSQL when parsing schema. Enum, array, composite, range,
|
55
|
+
and multirange types each have their own separate type parsing
|
56
|
+
method. So if you were overriding Database#schema_column_type to
|
57
|
+
implement custom column schema parsing, you may need to adjust
|
58
|
+
your code.
|
59
|
+
|
60
|
+
* The Sequel::Postgres::ExtendedDateSupport::DATE_YEAR_1 constant
|
61
|
+
has been removed.
|
@@ -0,0 +1,26 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* An adapter has been added for the trilogy MySQL driver. One large
|
4
|
+
advantage over mysql2 is that trilogy does not require any MySQL
|
5
|
+
client libraries installed on the machine. The trilogy adapter
|
6
|
+
has basically the same issues/skipped specs as the mysql2 adapter,
|
7
|
+
but it also does not support an application_timezone different
|
8
|
+
than the database_timezone.
|
9
|
+
|
10
|
+
* Model dataset modules now have a model accessor, allowing for
|
11
|
+
code such as:
|
12
|
+
|
13
|
+
class Foo < Sequel::Model
|
14
|
+
dataset_module do
|
15
|
+
where :kept, Sequel[model.table_name][:discarded_at] => nil
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
= Improvements
|
20
|
+
|
21
|
+
* The mysql adapter now works with ruby-mysql 4 (the pure-ruby
|
22
|
+
MySQL driver). Note that multi-results support does not work
|
23
|
+
with ruby-mysql 4 (it doesn't work with mysql2, trilogy, or
|
24
|
+
other Sequel adapters in general).
|
25
|
+
|
26
|
+
* Warnings for unsupported flags are now avoided on ruby-mysql 3.
|
@@ -0,0 +1,35 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* A sharded_timed_queue connection pool has been added. This offers
|
4
|
+
most of the same features as the sharded_threaded connection pool,
|
5
|
+
but uses the new Queue#pop :timeout features added in Ruby 3.2 to
|
6
|
+
allow for a simpler and possibly faster and more robust
|
7
|
+
implementation.
|
8
|
+
|
9
|
+
* If a :pool_class option is not specified when creating a Database,
|
10
|
+
Sequel will now look at the SEQUEL_DEFAULT_CONNECTION_POOL
|
11
|
+
environment variable to determine the connection pool class to use.
|
12
|
+
This allows you to set SEQUEL_DEFAULT_CONNECTION_POOL=timed_queue
|
13
|
+
on Ruby 3.2 to test with the timed_queue connection pool without
|
14
|
+
making any code changes. If the :servers Database option is given,
|
15
|
+
Sequel will automatically use the sharded version of the connection
|
16
|
+
pool specified by SEQUEL_DEFAULT_CONNECTION_POOL.
|
17
|
+
|
18
|
+
= Other Improvements
|
19
|
+
|
20
|
+
* The connection_validator, connection_expiration, and
|
21
|
+
async_thread_pool extensions now work with the timed_queue and
|
22
|
+
sharded_timed_queue connection pools.
|
23
|
+
|
24
|
+
* The sharded_threaded connection pool now disconnects connections
|
25
|
+
for all specified servers instead of just the last specified server
|
26
|
+
when using remove_server.
|
27
|
+
|
28
|
+
* The static_cache plugin now recognizes when the forbid_lazy_load
|
29
|
+
plugin is already loaded, and does not return instances that
|
30
|
+
forbid lazy load for methods that return a single object, such as
|
31
|
+
Database.{[],cache_get_pk,first}.
|
32
|
+
|
33
|
+
* Sequel now displays an informative error message if attempting to
|
34
|
+
load the connection_validator or connection_expiration extensions
|
35
|
+
when using the single threaded connection pool.
|
@@ -0,0 +1,21 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* A pg_xmin_optimistic_locking plugin has been added. This plugin
|
4
|
+
uses PostgreSQL's xmin system column to implement optimistic
|
5
|
+
locking. The xmin system column is automatically updated whenever
|
6
|
+
the database row is updated. You can load this plugin into a
|
7
|
+
base model and have all models that subclass from it use optimistic
|
8
|
+
locking, without needing any user-defined lock columns.
|
9
|
+
|
10
|
+
= Other Improvements
|
11
|
+
|
12
|
+
* set_column_allow_null is now a reversible migration method inside
|
13
|
+
alter_table blocks.
|
14
|
+
|
15
|
+
* The use of ILIKE no longer forces the ESCAPE clause on PostgreSQL,
|
16
|
+
which allows the use of ILIKE ANY and other constructions. There
|
17
|
+
is no need to use the ESCAPE clause with ILIKE, because the value
|
18
|
+
Sequel uses is PostgreSQL's default.
|
19
|
+
|
20
|
+
* The xid PostgreSQL type is now recognized as an integer type in the
|
21
|
+
jdbc/postgresql adapter.
|
@@ -0,0 +1,33 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* A pg_auto_parameterize_in_array extension has been added, which
|
4
|
+
handles conversion of IN/NOT IN to = ANY or != ALL for more types.
|
5
|
+
The pg_auto_parameterize extension only handles integer types by
|
6
|
+
default, because other types require the pg_array extension. This
|
7
|
+
new extension adds handling for Float, BigDecimal, Date, Time,
|
8
|
+
DateTime, Sequel::SQLTime, and Sequel::SQL::Blob types. It can
|
9
|
+
also handle String types if the :treat_string_list_as_text_array
|
10
|
+
Database option is present, using the text type for that. Handling
|
11
|
+
String values as text is not the default because that may cause
|
12
|
+
issues for some queries.
|
13
|
+
|
14
|
+
= Other Improvements
|
15
|
+
|
16
|
+
* The defaults_setter plugin now does a deep copy of database
|
17
|
+
default values that are hash/array or delegates to hash/array.
|
18
|
+
This fixes cases where the database default values are mutated.
|
19
|
+
|
20
|
+
* Sequel now correctly handles infinite and NaN float values used
|
21
|
+
inside PostgreSQL array bound variables.
|
22
|
+
|
23
|
+
* The data in the cache files used by the schema_caching and
|
24
|
+
index_caching extensions and static_cache_cache and
|
25
|
+
pg_auto_constraint_validations plugins are now sorted before the
|
26
|
+
cache file is saved, increasing consistency between runs.
|
27
|
+
|
28
|
+
* bigdecimal has been added as a dependency. bigdecimal is currently
|
29
|
+
a default gem in Ruby from 1.9 to 3.2, but it will move to a
|
30
|
+
bundled gem in Ruby 3.4, and there will be warnings in Ruby 3.3
|
31
|
+
for cases that will break in Ruby 3.4. Adding bigdecimal as a
|
32
|
+
dependency should avoid warnings when using bundler in Ruby 3.3,
|
33
|
+
and should avoid errors in Ruby 3.4.
|
@@ -0,0 +1,66 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* A paged_operations plugin has been added, which adds support for
|
4
|
+
paged_datasets, paged_update, and paged_delete dataset methods.
|
5
|
+
This methods are designed to be used on large datasets, to split
|
6
|
+
a large query into separate smaller queries, to avoid locking the
|
7
|
+
related database table for a long period of time.
|
8
|
+
paged_update and paged_delete operate the same as update and delete,
|
9
|
+
returning the number of rows updated or deleted. paged_datasets yields
|
10
|
+
one or more datasets representing subsets of the receiver, with the
|
11
|
+
union of all of those datasets comprising all records in the receiver:
|
12
|
+
|
13
|
+
Album.plugin :paged_operations
|
14
|
+
|
15
|
+
Album.where{name > 'M'}.paged_datasets{|ds| puts ds.sql}
|
16
|
+
# Runs: SELECT id FROM albums WHERE (name <= 'M') ORDER BY id LIMIT 1 OFFSET 1000
|
17
|
+
# Prints: SELECT * FROM albums WHERE ((name <= 'M') AND ("id" < 1002))
|
18
|
+
# Runs: SELECT id FROM albums WHERE ((name <= 'M') AND (id >= 1002)) ORDER BY id LIMIT 1 OFFSET 1000
|
19
|
+
# Prints: SELECT * FROM albums WHERE ((name <= 'M') AND ("id" < 2002) AND (id >= 1002))
|
20
|
+
# ...
|
21
|
+
# Runs: SELECT id FROM albums WHERE ((name <= 'M') AND (id >= 10002)) ORDER BY id LIMIT 1 OFFSET 1000
|
22
|
+
# Prints: SELECT * FROM albums WHERE ((name <= 'M') AND (id >= 10002))
|
23
|
+
|
24
|
+
Album.where{name <= 'M'}.paged_update(:updated_at=>Sequel::CURRENT_TIMESTAMP)
|
25
|
+
# SELECT id FROM albums WHERE (name <= 'M') ORDER BY id LIMIT 1 OFFSET 1000
|
26
|
+
# UPDATE albums SET updated_at = CURRENT_TIMESTAMP WHERE ((name <= 'M') AND ("id" < 1002))
|
27
|
+
# SELECT id FROM albums WHERE ((name <= 'M') AND (id >= 1002)) ORDER BY id LIMIT 1 OFFSET 1000
|
28
|
+
# UPDATE albums SET updated_at = CURRENT_TIMESTAMP WHERE ((name <= 'M') AND ("id" < 2002) AND (id >= 1002))
|
29
|
+
# ...
|
30
|
+
# SELECT id FROM albums WHERE ((name <= 'M') AND (id >= 10002)) ORDER BY id LIMIT 1 OFFSET 1000
|
31
|
+
# UPDATE albums SET updated_at = CURRENT_TIMESTAMP WHERE ((name <= 'M') AND (id >= 10002))
|
32
|
+
|
33
|
+
Album.where{name > 'M'}.paged_delete
|
34
|
+
# SELECT id FROM albums WHERE (name > 'M') ORDER BY id LIMIT 1 OFFSET 1000
|
35
|
+
# DELETE FROM albums WHERE ((name > 'M') AND (id < 1002))
|
36
|
+
# SELECT id FROM albums WHERE (name > 'M') ORDER BY id LIMIT 1 OFFSET 1000
|
37
|
+
# DELETE FROM albums WHERE ((name > 'M') AND (id < 2002))
|
38
|
+
# ...
|
39
|
+
# SELECT id FROM albums WHERE (name > 'M') ORDER BY id LIMIT 1 OFFSET 1000
|
40
|
+
# DELETE FROM albums WHERE (name > 'M')
|
41
|
+
|
42
|
+
* A Dataset#transaction :skip_transaction option is now support to
|
43
|
+
checkout a connection from the pool without opening a transaction. This
|
44
|
+
makes it easier to handle cases where a transaction may or not be used
|
45
|
+
based on configuration/options. Dataset#import and Dataset#paged_each
|
46
|
+
now both support the :skip_transaction option to skip transactions.
|
47
|
+
|
48
|
+
* Dataset#full_text_search now supports the to_tsquery: :websearch option
|
49
|
+
on PostgreSQL 11+, to use the websearch_to_tsquery database function.
|
50
|
+
|
51
|
+
* The Sequel::MassAssignmentRestriction exception now supports model
|
52
|
+
and column methods to get provide additional information about the
|
53
|
+
exception. Additionally, the exception message now includes information
|
54
|
+
about the model class.
|
55
|
+
|
56
|
+
= Other Improvements
|
57
|
+
|
58
|
+
* The ibmdb and jdbc/db2 adapter now both handle disconnect errors
|
59
|
+
correctly, removing the related connection from the pool.
|
60
|
+
|
61
|
+
* Dataset#import no longer uses an explicit transaction if given a dataset
|
62
|
+
value, as in that case, only a single query is used.
|
63
|
+
|
64
|
+
* The column_encryption plugin no longer uses the base64 library. The
|
65
|
+
base64 library is moving from the standard library to a bundled gem
|
66
|
+
in Ruby 3.4, and this avoids having a dependency on it.
|
@@ -0,0 +1,45 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* Sequel.migration blocks now support a revert method, which reverts
|
4
|
+
the changes in the block on up, and applies them on down. So if
|
5
|
+
you have a migration such as:
|
6
|
+
|
7
|
+
Sequel.migration do
|
8
|
+
change do
|
9
|
+
create_table :table do
|
10
|
+
# ...
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
and you later want to add a migration that drops the table, you
|
16
|
+
can use:
|
17
|
+
|
18
|
+
Sequel.migration do
|
19
|
+
revert do
|
20
|
+
create_table :table do
|
21
|
+
# ...
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
This will drop the table when migrating up, and create a table
|
27
|
+
with the given schema when migrating down.
|
28
|
+
|
29
|
+
* is_json and is_not_json methods have been added to the pg_json_ops
|
30
|
+
extension, for the IS [NOT] JSON operator supported in PostgreSQL
|
31
|
+
16+. These were previously added in Sequel 5.59.0, and removed
|
32
|
+
in Sequel 5.61.0 as support was removed in PostgreSQL 15 beta 4.
|
33
|
+
PostgreSQL 16 shipped with support for them, so support has been
|
34
|
+
recommitted to Sequel.
|
35
|
+
|
36
|
+
= Other Improvements
|
37
|
+
|
38
|
+
* SQLite generated columns now show up in Database#schema when using
|
39
|
+
SQLite 3.37+.
|
40
|
+
|
41
|
+
* Sequel now attempts to avoid an infinite loop in pathlogical cases
|
42
|
+
in the jdbc adapter, where the exception cause chain has a loop.
|
43
|
+
Additionally, if an exception is already recognized as a disconnect,
|
44
|
+
or an exception already responds to a getSQLState method, Sequel no
|
45
|
+
longer looks at the causes of the exception.
|
@@ -0,0 +1,35 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* Database#{defer,immediate}_constraints methods have been added on
|
4
|
+
PostgreSQL for changing handling of deferrable constraints inside
|
5
|
+
a transaction. defer_constraints sets deferrable constraints to
|
6
|
+
be deferred (not checked until transaction commit), and
|
7
|
+
immediate_constraints sets deferrable constraints to be checked
|
8
|
+
as part of the related query, and any already deferred constraint
|
9
|
+
checks to be applied immediately. You can pass the :constraints
|
10
|
+
option to only apply the changes to specific constraints.
|
11
|
+
|
12
|
+
* TimestampMigrator.run_single has been added, to migrate a single
|
13
|
+
migration up or down.
|
14
|
+
|
15
|
+
= Other Improvements
|
16
|
+
|
17
|
+
* INSERT RETURNING is now supported on MariaDB 10.5+, and used
|
18
|
+
automatically when saving new model objects. Note that this
|
19
|
+
is not supported when using the jdbc adapter, because the
|
20
|
+
jdbc-mysql driver doesn't support it. A jdbc/mariadb adapter
|
21
|
+
could be added, as it's likely recent versions of the
|
22
|
+
jdbc-mariadb driver would support it, but the jdbc-mariadb gem
|
23
|
+
hasn't been updated in over 4 years. Talk to the jdbc-mariadb
|
24
|
+
gem maintainers if you want to use this feature with the jdbc
|
25
|
+
adapter.
|
26
|
+
|
27
|
+
* The Dataset#paged_each optimization in the postgres adapter
|
28
|
+
now respects the :skip_transaction option, making it the
|
29
|
+
same as the :hold option. Note that this has effects beyond
|
30
|
+
just skipping the transaction, but non-HOLD cursors are only
|
31
|
+
supported inside transactions.
|
32
|
+
|
33
|
+
* The any_not_empty? extension's Dataset#any? method now supports
|
34
|
+
an argument, passing it to Enumerable#any? (which has supported
|
35
|
+
an argument since Ruby 2.5).
|