sequel 5.45.0 → 5.77.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +434 -0
- data/MIT-LICENSE +1 -1
- data/README.rdoc +59 -27
- data/bin/sequel +11 -3
- data/doc/advanced_associations.rdoc +16 -14
- data/doc/association_basics.rdoc +119 -24
- data/doc/cheat_sheet.rdoc +11 -3
- data/doc/mass_assignment.rdoc +1 -1
- data/doc/migration.rdoc +27 -6
- data/doc/model_hooks.rdoc +1 -1
- data/doc/object_model.rdoc +8 -8
- data/doc/opening_databases.rdoc +28 -12
- data/doc/postgresql.rdoc +16 -8
- data/doc/querying.rdoc +5 -3
- data/doc/release_notes/5.46.0.txt +87 -0
- data/doc/release_notes/5.47.0.txt +59 -0
- data/doc/release_notes/5.48.0.txt +14 -0
- data/doc/release_notes/5.49.0.txt +59 -0
- data/doc/release_notes/5.50.0.txt +78 -0
- data/doc/release_notes/5.51.0.txt +47 -0
- data/doc/release_notes/5.52.0.txt +87 -0
- data/doc/release_notes/5.53.0.txt +23 -0
- data/doc/release_notes/5.54.0.txt +27 -0
- data/doc/release_notes/5.55.0.txt +21 -0
- data/doc/release_notes/5.56.0.txt +51 -0
- data/doc/release_notes/5.57.0.txt +23 -0
- data/doc/release_notes/5.58.0.txt +31 -0
- 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/schema_modification.rdoc +1 -1
- data/doc/security.rdoc +9 -9
- data/doc/sharding.rdoc +3 -1
- data/doc/sql.rdoc +27 -15
- data/doc/testing.rdoc +23 -13
- data/doc/transactions.rdoc +6 -6
- data/doc/virtual_rows.rdoc +1 -1
- data/lib/sequel/adapters/ado/access.rb +1 -1
- data/lib/sequel/adapters/ado.rb +1 -1
- data/lib/sequel/adapters/amalgalite.rb +3 -5
- data/lib/sequel/adapters/ibmdb.rb +3 -3
- data/lib/sequel/adapters/jdbc/derby.rb +8 -0
- data/lib/sequel/adapters/jdbc/h2.rb +63 -10
- data/lib/sequel/adapters/jdbc/hsqldb.rb +8 -0
- data/lib/sequel/adapters/jdbc/postgresql.rb +7 -4
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +15 -0
- data/lib/sequel/adapters/jdbc/sqlserver.rb +4 -0
- data/lib/sequel/adapters/jdbc.rb +24 -22
- data/lib/sequel/adapters/mysql.rb +92 -67
- data/lib/sequel/adapters/mysql2.rb +56 -51
- data/lib/sequel/adapters/odbc/mssql.rb +1 -1
- data/lib/sequel/adapters/odbc.rb +1 -1
- data/lib/sequel/adapters/oracle.rb +4 -3
- data/lib/sequel/adapters/postgres.rb +89 -45
- data/lib/sequel/adapters/shared/access.rb +11 -1
- data/lib/sequel/adapters/shared/db2.rb +42 -0
- data/lib/sequel/adapters/shared/mssql.rb +91 -10
- data/lib/sequel/adapters/shared/mysql.rb +78 -3
- data/lib/sequel/adapters/shared/oracle.rb +86 -7
- data/lib/sequel/adapters/shared/postgres.rb +576 -171
- data/lib/sequel/adapters/shared/sqlanywhere.rb +21 -5
- data/lib/sequel/adapters/shared/sqlite.rb +92 -8
- data/lib/sequel/adapters/sqlanywhere.rb +1 -1
- data/lib/sequel/adapters/sqlite.rb +99 -18
- data/lib/sequel/adapters/tinytds.rb +1 -1
- data/lib/sequel/adapters/trilogy.rb +117 -0
- data/lib/sequel/adapters/utils/columns_limit_1.rb +22 -0
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +1 -1
- data/lib/sequel/ast_transformer.rb +6 -0
- data/lib/sequel/connection_pool/sharded_single.rb +5 -7
- 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/single.rb +6 -8
- 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/core.rb +17 -18
- data/lib/sequel/database/connecting.rb +27 -3
- data/lib/sequel/database/dataset.rb +16 -6
- data/lib/sequel/database/misc.rb +70 -14
- data/lib/sequel/database/query.rb +73 -2
- data/lib/sequel/database/schema_generator.rb +11 -6
- data/lib/sequel/database/schema_methods.rb +23 -4
- data/lib/sequel/database/transactions.rb +6 -0
- data/lib/sequel/dataset/actions.rb +111 -15
- data/lib/sequel/dataset/deprecated_singleton_class_methods.rb +42 -0
- data/lib/sequel/dataset/features.rb +20 -1
- data/lib/sequel/dataset/misc.rb +12 -2
- data/lib/sequel/dataset/placeholder_literalizer.rb +20 -9
- data/lib/sequel/dataset/query.rb +170 -41
- data/lib/sequel/dataset/sql.rb +190 -71
- data/lib/sequel/dataset.rb +4 -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 +14 -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/core_refinements.rb +36 -11
- data/lib/sequel/extensions/date_arithmetic.rb +36 -8
- data/lib/sequel/extensions/date_parse_input_handler.rb +67 -0
- data/lib/sequel/extensions/datetime_parse_to_time.rb +5 -1
- data/lib/sequel/extensions/duplicate_columns_handler.rb +11 -10
- data/lib/sequel/extensions/index_caching.rb +5 -1
- data/lib/sequel/extensions/inflector.rb +1 -1
- data/lib/sequel/extensions/is_distinct_from.rb +141 -0
- data/lib/sequel/extensions/looser_typecasting.rb +3 -0
- data/lib/sequel/extensions/migration.rb +57 -15
- data/lib/sequel/extensions/named_timezones.rb +22 -6
- data/lib/sequel/extensions/pagination.rb +1 -1
- data/lib/sequel/extensions/pg_array.rb +33 -4
- data/lib/sequel/extensions/pg_array_ops.rb +2 -2
- 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 +39 -28
- data/lib/sequel/extensions/pg_extended_integer_support.rb +116 -0
- data/lib/sequel/extensions/pg_hstore.rb +6 -1
- data/lib/sequel/extensions/pg_hstore_ops.rb +53 -3
- data/lib/sequel/extensions/pg_inet.rb +10 -11
- data/lib/sequel/extensions/pg_inet_ops.rb +1 -1
- data/lib/sequel/extensions/pg_interval.rb +11 -11
- data/lib/sequel/extensions/pg_json.rb +13 -15
- data/lib/sequel/extensions/pg_json_ops.rb +125 -2
- data/lib/sequel/extensions/pg_multirange.rb +367 -0
- data/lib/sequel/extensions/pg_range.rb +13 -26
- data/lib/sequel/extensions/pg_range_ops.rb +37 -9
- data/lib/sequel/extensions/pg_row.rb +20 -19
- data/lib/sequel/extensions/pg_row_ops.rb +1 -1
- data/lib/sequel/extensions/pg_timestamptz.rb +27 -3
- data/lib/sequel/extensions/round_timestamps.rb +1 -1
- data/lib/sequel/extensions/s.rb +2 -1
- data/lib/sequel/extensions/schema_caching.rb +1 -1
- data/lib/sequel/extensions/schema_dumper.rb +45 -11
- data/lib/sequel/extensions/server_block.rb +10 -13
- data/lib/sequel/extensions/set_literalizer.rb +58 -0
- data/lib/sequel/extensions/sql_comments.rb +110 -3
- data/lib/sequel/extensions/sql_log_normalizer.rb +108 -0
- data/lib/sequel/extensions/sqlite_json_ops.rb +255 -0
- data/lib/sequel/extensions/string_agg.rb +1 -1
- data/lib/sequel/extensions/string_date_time.rb +19 -23
- 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 +286 -92
- data/lib/sequel/model/base.rb +53 -33
- data/lib/sequel/model/dataset_module.rb +3 -0
- data/lib/sequel/model/errors.rb +10 -1
- data/lib/sequel/model/exceptions.rb +15 -3
- data/lib/sequel/model/inflections.rb +1 -1
- data/lib/sequel/plugins/auto_restrict_eager_graph.rb +62 -0
- data/lib/sequel/plugins/auto_validations.rb +74 -16
- data/lib/sequel/plugins/class_table_inheritance.rb +2 -2
- data/lib/sequel/plugins/column_encryption.rb +29 -8
- data/lib/sequel/plugins/composition.rb +3 -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/enum.rb +124 -0
- data/lib/sequel/plugins/finder.rb +4 -2
- data/lib/sequel/plugins/insert_conflict.rb +4 -0
- data/lib/sequel/plugins/instance_specific_default.rb +1 -1
- data/lib/sequel/plugins/json_serializer.rb +2 -2
- data/lib/sequel/plugins/lazy_attributes.rb +3 -0
- data/lib/sequel/plugins/list.rb +8 -3
- data/lib/sequel/plugins/many_through_many.rb +109 -10
- 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_array_associations.rb +46 -34
- 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 +12 -2
- 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/serialization.rb +1 -0
- data/lib/sequel/plugins/serialization_modification_detection.rb +1 -0
- data/lib/sequel/plugins/single_table_inheritance.rb +8 -0
- data/lib/sequel/plugins/sql_comments.rb +189 -0
- data/lib/sequel/plugins/static_cache.rb +39 -1
- data/lib/sequel/plugins/static_cache_cache.rb +5 -1
- data/lib/sequel/plugins/subclasses.rb +28 -11
- data/lib/sequel/plugins/tactical_eager_loading.rb +23 -10
- data/lib/sequel/plugins/timestamps.rb +1 -1
- data/lib/sequel/plugins/unused_associations.rb +521 -0
- data/lib/sequel/plugins/update_or_create.rb +1 -1
- data/lib/sequel/plugins/validate_associated.rb +22 -12
- data/lib/sequel/plugins/validation_helpers.rb +41 -11
- data/lib/sequel/plugins/validation_helpers_generic_type_messages.rb +73 -0
- data/lib/sequel/plugins/xml_serializer.rb +1 -1
- data/lib/sequel/sql.rb +1 -1
- data/lib/sequel/timezones.rb +12 -14
- data/lib/sequel/version.rb +1 -1
- metadata +109 -19
data/doc/opening_databases.rdoc
CHANGED
@@ -102,6 +102,7 @@ The following options can be specified and are passed to the database's internal
|
|
102
102
|
:after_connect :: A callable object called after each new connection is made, with the
|
103
103
|
connection object (and server argument if the callable accepts 2 arguments),
|
104
104
|
useful for customizations that you want to apply to all connections (nil by default).
|
105
|
+
:connect_sqls :: An array of sql strings to execute on each new connection, after :after_connect runs.
|
105
106
|
:max_connections :: The maximum size of the connection pool (4 connections by default on most databases)
|
106
107
|
:pool_timeout :: The number of seconds to wait if a connection cannot be acquired before raising an error (5 seconds by default)
|
107
108
|
:single_threaded :: Whether to use a single-threaded (non-thread safe) connection pool
|
@@ -249,7 +250,7 @@ jdbc-mysql :: Depending on the configuration of the MySQL server, jdbc-mysql ver
|
|
249
250
|
|
250
251
|
Requires: mysql
|
251
252
|
|
252
|
-
|
253
|
+
This should work with the mysql gem (C extension) and the ruby-mysql gem (pure ruby).
|
253
254
|
|
254
255
|
The following additional options are supported:
|
255
256
|
|
@@ -258,6 +259,8 @@ The following additional options are supported:
|
|
258
259
|
:compress :: Whether to compress data sent/received via the socket connection.
|
259
260
|
:config_default_group :: The default group to read from the in the MySQL config file, defaults to "client")
|
260
261
|
:config_local_infile :: If provided, sets the Mysql::OPT_LOCAL_INFILE option on the connection with the given value.
|
262
|
+
:disable_split_materialized :: Set split_materialized=off in the optimizer settings. Necessary to pass the associations
|
263
|
+
integration tests in MariaDB 10.5+, due to a unfixed bug in the optimizer.
|
261
264
|
:encoding :: Specify the encoding/character set to use for the connection.
|
262
265
|
:fractional_seconds :: On MySQL 5.6.5+, this option is recognized and will include fractional seconds in
|
263
266
|
time/timestamp values, as well as have the schema method create columns that can contain
|
@@ -265,7 +268,7 @@ The following additional options are supported:
|
|
265
268
|
to MySQL.
|
266
269
|
:socket :: Can be used to specify a Unix socket file to connect to instead of a TCP host and port.
|
267
270
|
:sql_mode :: Set the sql_mode(s) for a given connection. Can be single symbol or string,
|
268
|
-
or an array of symbols or strings (e.g. <tt
|
271
|
+
or an array of symbols or strings (e.g. <tt>sql_mode: [:no_zero_date, :pipes_as_concat]</tt>).
|
269
272
|
:timeout :: Sets the wait_timeout for the connection, defaults to 1 month.
|
270
273
|
:read_timeout :: Set the timeout in seconds for reading back results to a query.
|
271
274
|
:connect_timeout :: Set the timeout in seconds before a connection attempt is abandoned
|
@@ -276,22 +279,24 @@ if either the :sslca or :sslkey option is given.
|
|
276
279
|
|
277
280
|
=== mysql2
|
278
281
|
|
279
|
-
This is a
|
282
|
+
This is a MySQL adapter that does typecasting in C, so it is often faster than the
|
280
283
|
mysql adapter. The options given are passed to Mysql2::Client.new, see the mysql2 documentation
|
281
|
-
for details on what options are supported.
|
284
|
+
for details on what options are supported. The :timeout, :auto_is_null, :sql_mode, and :disable_split_materialized
|
285
|
+
options supported by the mysql adapter are also supported for mysql2 adapter (and any other adapters connecting to
|
286
|
+
mysql, such as the jdbc/mysql adapter).
|
282
287
|
|
283
288
|
=== odbc
|
284
289
|
|
285
290
|
The ODBC adapter allows you to connect to any database with the appropriate ODBC drivers installed.
|
286
291
|
The :database option given ODBC database should be the DSN (Descriptive Service Name) from the ODBC configuration.
|
287
292
|
|
288
|
-
Sequel.odbc('mydb', :
|
293
|
+
Sequel.odbc('mydb', user: "user", password: "password")
|
289
294
|
|
290
295
|
The :host and :port options are not respected. The following additional options are supported:
|
291
296
|
|
292
297
|
:db_type :: Can be specified as 'mssql', 'progress', or 'db2' to use SQL syntax specific to those databases.
|
293
298
|
:drvconnect :: Can be given an ODBC connection string, and will use ODBC::Database#drvconnect to
|
294
|
-
do the connection. Typical usage would be: <tt>Sequel.odbc(:
|
299
|
+
do the connection. Typical usage would be: <tt>Sequel.odbc(drvconnect: 'driver={...};...')</tt>
|
295
300
|
|
296
301
|
=== oracle
|
297
302
|
|
@@ -307,15 +312,14 @@ The following additional options are supported:
|
|
307
312
|
|
308
313
|
=== postgres
|
309
314
|
|
310
|
-
Requires: pg (or postgres-pr/postgres-compat if pg is not available)
|
315
|
+
Requires: pg (or sequel/postgres-pr or postgres-pr/postgres-compat if pg is not available)
|
311
316
|
|
312
|
-
The Sequel postgres adapter works with the pg and postgres-pr ruby libraries.
|
317
|
+
The Sequel postgres adapter works with the pg, sequel-postgres-pr, jeremyevans-postgres-pr, and postgres-pr ruby libraries.
|
313
318
|
The pg library is the best supported, as it supports real bound variables and prepared statements.
|
314
319
|
If the pg library is being used, Sequel will also attempt to load the sequel_pg library, which is
|
315
320
|
a C extension that optimizes performance when Sequel is used with pg. All users of Sequel who
|
316
|
-
use pg are encouraged to install sequel_pg. For users who want to use postgres-pr
|
317
|
-
with C extensions, it is recommended to use
|
318
|
-
the upstream postgres-pr gem, and is regularly tested with Sequel.
|
321
|
+
use pg are encouraged to install sequel_pg. For users who want to use one of the postgres-pr
|
322
|
+
libraries to avoid issues with C extensions, it is recommended to use sequel-postgres-pr.
|
319
323
|
|
320
324
|
The following additional options are supported:
|
321
325
|
|
@@ -341,7 +345,7 @@ The following additional options are supported:
|
|
341
345
|
:search_path :: Set to the schema search_path. This can either be a single string containing the schemas
|
342
346
|
separated by commas (for use via a URL: <tt>postgres:///?search_path=schema1,schema2</tt>), or it
|
343
347
|
can be an array of strings (for use via an option:
|
344
|
-
<tt>Sequel.postgres(:
|
348
|
+
<tt>Sequel.postgres(search_path: ['schema1', 'schema2'])</tt>).
|
345
349
|
:use_iso_date_format :: This can be set to false to not force the ISO date format. Sequel forces
|
346
350
|
it by default to allow for an optimization.
|
347
351
|
|
@@ -383,6 +387,11 @@ The following additional options are supported:
|
|
383
387
|
|
384
388
|
:readonly :: open database in read-only mode
|
385
389
|
:timeout :: the busy timeout to use in milliseconds (default: 5000).
|
390
|
+
:setup_regexp_function :: Whether to setup a REGEXP function in the underlying SQLite3::Database object. Doing so
|
391
|
+
allows you to use regexp support in dataset expressions. If +:cached+ or <tt>"cached"</tt>+, caches each
|
392
|
+
unique regex (more efficient but risk of memory leak). If a Proc is provided, it will be called with
|
393
|
+
a string for the regexp and a string for the value to compare, and should return whether the regexp
|
394
|
+
string matches the string value to compare. The default Proc used does <tt>Regexp.new(regexp_str).match(str)</tt>.
|
386
395
|
|
387
396
|
Note that SQLite memory databases are restricted to a single connection by
|
388
397
|
default. This is because SQLite does not allow multiple connections to
|
@@ -416,3 +425,10 @@ Other Sequel specific options:
|
|
416
425
|
This should be specified as an integer. If you plan on setting large
|
417
426
|
text or blob values via tinytds, you should use this option or modify
|
418
427
|
your freetds.conf file.
|
428
|
+
|
429
|
+
=== trilogy
|
430
|
+
|
431
|
+
This is a MySQL adapter that does typecasting in C, and does not require any mysql client libraries installed.
|
432
|
+
The options given are passed to Trilogy.new, see the trilogy documentation for details on what options are
|
433
|
+
supported. The :timeout, :auto_is_null, :sql_mode, and :disable_split_materialized
|
434
|
+
options supported by the mysql adapter are also supported for trilogy adapter.
|
data/doc/postgresql.rdoc
CHANGED
@@ -295,16 +295,16 @@ option to +foreign_key_list+:
|
|
295
295
|
primary_key :id
|
296
296
|
Integer :i
|
297
297
|
Integer :j
|
298
|
-
foreign_key :a_id, :a, :
|
298
|
+
foreign_key :a_id, :a, foreign_key_constraint_name: :a_a
|
299
299
|
unique [:i, :j]
|
300
300
|
end
|
301
301
|
DB.create_table!(:b) do
|
302
|
-
foreign_key :a_id, :a, :
|
302
|
+
foreign_key :a_id, :a, foreign_key_constraint_name: :a_a
|
303
303
|
Integer :c
|
304
304
|
Integer :d
|
305
|
-
foreign_key [:c, :d], :a, :
|
305
|
+
foreign_key [:c, :d], :a, key: [:j, :i], name: :a_c_d
|
306
306
|
end
|
307
|
-
DB.foreign_key_list(:a, :
|
307
|
+
DB.foreign_key_list(:a, reverse: true)
|
308
308
|
# => [
|
309
309
|
# {:name=>:a_a, :columns=>[:a_id], :key=>[:id], :on_update=>:no_action, :on_delete=>:no_action, :deferrable=>false, :table=>:a, :schema=>:public},
|
310
310
|
# {:name=>:a_a, :columns=>[:a_id], :key=>[:id], :on_update=>:no_action, :on_delete=>:no_action, :deferrable=>false, :table=>:b, :schema=>:public},
|
@@ -413,12 +413,12 @@ syntax:
|
|
413
413
|
|
414
414
|
DB.create_table(:table){primary_key :id}
|
415
415
|
# Ignore the given value for id, using the identity's sequence value.
|
416
|
-
DB[:table].overriding_user_value.insert(:
|
416
|
+
DB[:table].overriding_user_value.insert(id: 1)
|
417
417
|
|
418
|
-
DB.create_table(:table){primary_key :id, :
|
418
|
+
DB.create_table(:table){primary_key :id, identity: :always}
|
419
419
|
# Force the use of the given value for id, because otherwise the insert will
|
420
420
|
# raise an error, since GENERATED ALWAYS was used when creating the column.
|
421
|
-
DB[:table].overriding_system_value.insert(:
|
421
|
+
DB[:table].overriding_system_value.insert(id: 1)
|
422
422
|
|
423
423
|
=== Distinct On Specific Columns
|
424
424
|
|
@@ -428,6 +428,14 @@ rows that are distinct on just those columns:
|
|
428
428
|
DB[:table].distinct(:id).all
|
429
429
|
# SELECT DISTINCT ON ("id") * FROM "table"
|
430
430
|
|
431
|
+
=== JOIN USING table alias
|
432
|
+
|
433
|
+
Sequel allows passing an SQL::AliasedExpression to join table methods to use a USING
|
434
|
+
join with a table alias for the USING columns:
|
435
|
+
|
436
|
+
DB[:t1].join(:t2, Sequel.as([:c1, :c2], :alias))
|
437
|
+
# SELECT * FROM "t1" INNER JOIN "t2" USING ("c1", "c2") AS "alias"
|
438
|
+
|
431
439
|
=== Calling PostgreSQL 11+ Procedures <tt>postgres only</tt>
|
432
440
|
|
433
441
|
PostgreSQL 11+ added support for procedures, which are different from the user defined
|
@@ -553,7 +561,7 @@ such as the related table and column or constraint.
|
|
553
561
|
|
554
562
|
DB.create_table(:test1){primary_key :id}
|
555
563
|
DB.create_table(:test2){primary_key :id; foreign_key :test1_id, :test1}
|
556
|
-
DB[:test2].insert(:
|
564
|
+
DB[:test2].insert(test1_id: 1) rescue DB.error_info($!)
|
557
565
|
# => {
|
558
566
|
# :schema=>"public",
|
559
567
|
# :table=>"test2",
|
data/doc/querying.rdoc
CHANGED
@@ -357,7 +357,9 @@ For ranges, Sequel uses a pair of inequality statements:
|
|
357
357
|
# SELECT * FROM artists WHERE ((id >= 1) AND (id < 5))
|
358
358
|
|
359
359
|
Finally, for regexps, Sequel uses an SQL regular expression. Note that this
|
360
|
-
is
|
360
|
+
is only supported by default on PostgreSQL and MySQL. It can also be supported
|
361
|
+
on SQLite when using the sqlite adapter with the :setup_regexp_function
|
362
|
+
Database option.
|
361
363
|
|
362
364
|
Artist.where(name: /JM$/)
|
363
365
|
# SELECT * FROM artists WHERE (name ~ 'JM$')
|
@@ -498,7 +500,7 @@ filters:
|
|
498
500
|
# SELECT * FROM artists WHERE (id != 5)
|
499
501
|
|
500
502
|
Artist.where(id: 5).exclude{name > 'A'}
|
501
|
-
# SELECT * FROM artists WHERE ((id = 5)
|
503
|
+
# SELECT * FROM artists WHERE ((id = 5) AND (name <= 'A')
|
502
504
|
|
503
505
|
So to do a NOT IN with an array:
|
504
506
|
|
@@ -713,7 +715,7 @@ aggregation:
|
|
713
715
|
|
714
716
|
Album.select_group(:artist_id).select_append{sum(num_tracks).as(tracks)}
|
715
717
|
# SELECT artist_id, sum(num_tracks) AS tracks FROM albums GROUP BY artist_id
|
716
|
-
|
718
|
+
|
717
719
|
== Having
|
718
720
|
|
719
721
|
The SQL HAVING clause is similar to the WHERE clause, except that
|
@@ -0,0 +1,87 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* An unused_associations plugin has been added, which allows you to
|
4
|
+
determine which associations and association methods are not used.
|
5
|
+
You can use this to avoid defining the unused associations and
|
6
|
+
association methods, which can save memory.
|
7
|
+
|
8
|
+
This plugin is supported on Ruby 2.5+, and uses method coverage to
|
9
|
+
determine if the plugin's methods are called. Because Sequel::Model
|
10
|
+
adds association methods to an anonymous module included in the
|
11
|
+
class, directly using the method coverage data to determine which
|
12
|
+
associations are used is challenging.
|
13
|
+
|
14
|
+
This plugin is mostly designed for reporting. You can have a
|
15
|
+
test suite that runs with method coverage enabled, and use the
|
16
|
+
coverage information to get data on unused associations:
|
17
|
+
|
18
|
+
# Calls Coverage.result
|
19
|
+
cov_data = Sequel::Model.update_associations_coverage
|
20
|
+
unused_associations_data = Sequel::Model.update_unused_associations_data(coverage_data: cov_data)
|
21
|
+
Sequel::Model.unused_associations(unused_associations_data: unused_associations_data)
|
22
|
+
# => [["Class1", "assoc1"], ...]
|
23
|
+
|
24
|
+
unused_associations returns an array of two element arrays, where
|
25
|
+
the first element is the class name and the second element is the
|
26
|
+
association name. The returned values will be associations where
|
27
|
+
all of the association methods are not used.
|
28
|
+
|
29
|
+
In addition to determining which associations are not used, you can
|
30
|
+
also use this to determine if you are defining association methods
|
31
|
+
that are not used:
|
32
|
+
|
33
|
+
Sequel::Model.unused_association_options(unused_associations_data: unused_associations_data)
|
34
|
+
# => [["Class2", "assoc2", {:read_only=>true}], ...]
|
35
|
+
|
36
|
+
unused_association_options is similar to unused_associations, but
|
37
|
+
returns an array of three element arrays, where the third element
|
38
|
+
is a hash of association options that should be used to avoid
|
39
|
+
defining the unused association methods. It's common in Sequel to
|
40
|
+
define associations and only use them for reading data and not for
|
41
|
+
modifications, and you can use this to easily see which associations
|
42
|
+
are only used for reading data.
|
43
|
+
|
44
|
+
As the determination of whether associations are used is based on
|
45
|
+
method coverage, this will report as unused any associations that are
|
46
|
+
used but where the association methods are not called. These cases
|
47
|
+
are rare, but can happen if you have libraries that use the
|
48
|
+
association reflection metadata without calling the association
|
49
|
+
methods, or use the association only in combination with another
|
50
|
+
plugin such as dataset_associations. You can set the :is_used
|
51
|
+
association option to explicitly mark an association as used, and
|
52
|
+
have this plugin avoid reporting it as unused.
|
53
|
+
|
54
|
+
In addition to just reporting on unused associations, you can also
|
55
|
+
directly use the unused associations metadata to automatically avoid
|
56
|
+
defining unused associations or unused associations methods. You
|
57
|
+
can set a :file option when loading the plugin:
|
58
|
+
|
59
|
+
Sequel::Model.plugin :unused_associations, file: 'unused_associations.json'
|
60
|
+
|
61
|
+
Then run the method coverage testing. This will save the unused
|
62
|
+
associations metadata to the file. Then you can use this metadata
|
63
|
+
automatically by also setting the :modify_associations option:
|
64
|
+
|
65
|
+
Sequel::Model.plugin :unused_associations, file: 'unused_associations.json',
|
66
|
+
modify_associations: true
|
67
|
+
|
68
|
+
With the :modify_associations option, unused associations are
|
69
|
+
skipped instead of being defined, and the options returned by
|
70
|
+
unused_association_options are automatically used. Note that using
|
71
|
+
the :modify_associations option is risky unless you have complete
|
72
|
+
coverage and do not have cases where the associations are used
|
73
|
+
without calling methods.
|
74
|
+
|
75
|
+
It is common to have multiple test suites where you need to combine
|
76
|
+
coverage. The plugin supports this by using a :coverage_file option:
|
77
|
+
|
78
|
+
Sequel::Model.plugin :unused_associations, coverage_file: 'unused_associations_coverage.json'
|
79
|
+
|
80
|
+
In this case, you would run update_associations_coverage after each
|
81
|
+
test suite, and update_unused_associations_data only after all test
|
82
|
+
suites have been run.
|
83
|
+
|
84
|
+
* Passing nil as the value of the :setter, :adder, :remover, or
|
85
|
+
:clearer association options will cause the related method to not be
|
86
|
+
defined, instead of using the default value. This allows you to
|
87
|
+
only define the methods you will actually be using.
|
@@ -0,0 +1,59 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* Sequel now supports using separate queries for each table for both
|
4
|
+
lazy and eager loading of the following associations:
|
5
|
+
|
6
|
+
* many_to_many
|
7
|
+
* one_through_one
|
8
|
+
* many_through_many # many_through_many plugin
|
9
|
+
* one_through_many # many_through_many plugin
|
10
|
+
|
11
|
+
For many_to_many/one_through_one, you specify the :join_table_db
|
12
|
+
association option, which should be a Sequel::Database instance
|
13
|
+
containing the join table. It is possible for the current table,
|
14
|
+
join table, and associated table all to be in separate databases:
|
15
|
+
|
16
|
+
JOIN_TABLE_DB = Sequel.connect('...')
|
17
|
+
Album.many_to_many :artists, join_table_db: JOIN_TABLE_DB
|
18
|
+
|
19
|
+
For many_through_many/one_through_many, you can use the :db option
|
20
|
+
in each join table specification. All join tables can be in
|
21
|
+
separate databases:
|
22
|
+
|
23
|
+
JTDB1 = Sequel.connect('...')
|
24
|
+
JTDB2 = Sequel.connect('...')
|
25
|
+
# Tracks on all albums this artist appears on
|
26
|
+
Artist.many_through_many :album_tracks, [
|
27
|
+
{table: :albums_artists, left: :artist_id, right: :album_id, db: JTDB1},
|
28
|
+
{table: :artists, left: :id, right: :id, db: JTDB2}
|
29
|
+
],
|
30
|
+
class: :Track, right_primary_key: :album_id
|
31
|
+
|
32
|
+
* The :allow_eager_graph association option has been added. Setting
|
33
|
+
this option to false will disallow eager loading via #eager_graph.
|
34
|
+
This is useful if you can eager load the association via #eager,
|
35
|
+
but not with #eager_graph.
|
36
|
+
|
37
|
+
* The :allow_filtering_by association option has been added. Setting
|
38
|
+
this option to false will disallow the use of filtering by
|
39
|
+
associations for the association.
|
40
|
+
|
41
|
+
* Dataset#returning is now supported on SQLite 3.35.0+. To work around
|
42
|
+
bugs in the SQLite implementation, identifiers used in the RETURNING
|
43
|
+
clause are automatically aliased. Additionally, prepared statements
|
44
|
+
that use the RETURNING clause on SQLite seem to have issues, so the
|
45
|
+
prepared_statements plugin does not automatically use prepared
|
46
|
+
statements on SQLite for queries that use the RETURNING clause.
|
47
|
+
|
48
|
+
* Database#rename_tables has been added on MySQL to support renaming
|
49
|
+
multiple tables in the same query.
|
50
|
+
|
51
|
+
= Other Improvements
|
52
|
+
|
53
|
+
* The unused_associations plugin now tracks access to the association
|
54
|
+
reflection for associations, so it will no longer show an
|
55
|
+
association as completely unused if something is accessing the
|
56
|
+
association reflection for it. This eliminates most of the false
|
57
|
+
positives, where the plugin would show an association as unused
|
58
|
+
even though something was using it without calling the association
|
59
|
+
methods.
|
@@ -0,0 +1,14 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* A Sequel::Database#like_without_collate accessor has been added on
|
4
|
+
Microsoft SQL Server, which avoids using the COLLATE clause for
|
5
|
+
LIKE expressions. This can speed up query performance significantly.
|
6
|
+
|
7
|
+
* A private Sequel::Model::Errors#full_message method has been added
|
8
|
+
to make it easier to support internationalization for Sequel::Model
|
9
|
+
error messages.
|
10
|
+
|
11
|
+
= Other Improvements
|
12
|
+
|
13
|
+
* The association reflection tracking in the unused_associations
|
14
|
+
plugin now works correctly when combining coverage runs.
|
@@ -0,0 +1,59 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* Model#validates_no_null_byte has been added to the
|
4
|
+
validation_helpers. It checks that the value being validated does
|
5
|
+
not contain an ASCII NUL ('\0') byte. Some databases will return an
|
6
|
+
error if a string contains a NUL byte.
|
7
|
+
|
8
|
+
The auto_validations plugin will now automatically add no_null_byte
|
9
|
+
validations for all string columns in the model's table. This will
|
10
|
+
change exceptions raised by NUL bytes from database errors to
|
11
|
+
validation failures.
|
12
|
+
|
13
|
+
If you are using auto_validations and would like to have a table
|
14
|
+
accept NUL bytes in string columns, use the following code inside
|
15
|
+
the model:
|
16
|
+
|
17
|
+
skip_auto_validations(:no_null_byte)
|
18
|
+
|
19
|
+
* JSONB subscripts are now supported on PostgreSQL 14+ when using the
|
20
|
+
pg_json_ops extension. You can use JSONB subscripts to more easily
|
21
|
+
update part of a JSONB column:
|
22
|
+
|
23
|
+
DB[:table].update(Sequel.pg_jsonb_op(:column)['key'] => 'value')
|
24
|
+
UPDATE "table" SET "column"['key'] = 'value'
|
25
|
+
|
26
|
+
* hstore subscripts are now supported on PostgreSQL 14+ when using the
|
27
|
+
pg_hstore_ops extension. You can use hstore subscripts to more
|
28
|
+
easily update part of an hstore column:
|
29
|
+
|
30
|
+
DB[:table].update(Sequel.hstore_op(:column)['key'] => 'value')
|
31
|
+
UPDATE "table" SET "column"['key'] = 'value'
|
32
|
+
|
33
|
+
* Sequel now supports table aliases for JOIN USING columns on
|
34
|
+
PostgreSQL 14+. These allow you to reference the USING columns in
|
35
|
+
the query using a qualified identifier. To use this support, pass an
|
36
|
+
SQL::AliasedExpression as the expression to join on:
|
37
|
+
|
38
|
+
DB[:t1].join(:t2, Sequel.as([:c1, :c2], :alias))
|
39
|
+
# SELECT * FROM "t1" INNER JOIN "t2" USING ("c1", "c2") AS "alias"
|
40
|
+
|
41
|
+
* Database#create_trigger on PostgreSQL now supports a :replace option
|
42
|
+
for CREATE OR REPLACE TRIGGER (supported in PostgreSQL 14+).
|
43
|
+
|
44
|
+
* SQL::Expression#sequel_ast_transform has been added to support
|
45
|
+
AST transforms of custom expression classes.
|
46
|
+
|
47
|
+
= Other Improvements
|
48
|
+
|
49
|
+
* Sequel now supports calling PostgreSQL procedures without arguments
|
50
|
+
when using Database#call_procedure. Previously, attempts to call
|
51
|
+
procuredures without arguments would call the procedure with a
|
52
|
+
single NULL argument.
|
53
|
+
|
54
|
+
* Sequel now uses defined?(yield) instead of block_given? internally
|
55
|
+
for better performance on CRuby. defined?(yield) is faster as it is
|
56
|
+
built into the VM, while block_given? is a regular method and has
|
57
|
+
the overhead of calling a regular method. Note that defined?(yield)
|
58
|
+
is not implemented correctly on JRuby before 9.0.0.0, so this
|
59
|
+
release of Sequel drops support for JRuby versions before 9.0.0.0.
|
@@ -0,0 +1,78 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* A pg_multirange extension has been added with support for PostgreSQL
|
4
|
+
14+ multirange types. Multirange types are similar to an array of
|
5
|
+
ranges, where a value is in the multirange if it is in any of the
|
6
|
+
ranges contained in the multirange. Multiranges are useful when you
|
7
|
+
need to check against multiple ranges that do not overlap.
|
8
|
+
|
9
|
+
You can create multiranges using Sequel.pg_multirange, passing
|
10
|
+
an array of ranges and a multirange type:
|
11
|
+
|
12
|
+
DB.extension :pg_multirange
|
13
|
+
multirange = Sequel.pg_multirange(array_of_date_ranges, :datemultirange)
|
14
|
+
|
15
|
+
Sequel.pg_multirange returns a PGMultiRange, which operates as a
|
16
|
+
delegate to an array of PGRange objects. Behavior of the object
|
17
|
+
is similar to an array, except that cover? is supported, which will
|
18
|
+
test if any of the included ranges covers the argument:
|
19
|
+
|
20
|
+
multirange.cover?(Date.today)
|
21
|
+
|
22
|
+
Like the pg_range extension, this also supports registering custom
|
23
|
+
multirange types, and using multirange types as bound variables.
|
24
|
+
|
25
|
+
The pg_range_ops extension now supports both ranges and multiranges,
|
26
|
+
with a few new methods added to Postgres::RangeOp for converting
|
27
|
+
between them:
|
28
|
+
|
29
|
+
* range_merge
|
30
|
+
* multirange
|
31
|
+
* and unnest
|
32
|
+
|
33
|
+
* An sql_log_normalizer extension has been added for normalizing
|
34
|
+
logged SQL, replacing numbers and strings inside the SQL string
|
35
|
+
with question marks. This is useful for analytics and sensitive
|
36
|
+
data.
|
37
|
+
|
38
|
+
DB[:table].first(a: 1, b: 'something')
|
39
|
+
# Without sql_log_normalizer extension, logged SQL is:
|
40
|
+
# SELECT * FROM "table" WHERE (("a" = 1) AND ("b" = 'something')) LIMIT 1
|
41
|
+
|
42
|
+
DB.extension :sql_log_normalizer
|
43
|
+
DB[:table].first(a: 1, b: 'something')
|
44
|
+
# With sql_log_normalizer_extension, logged SQL is:
|
45
|
+
# SELECT * FROM "table" WHERE (("a" = ?) AND ("b" = ?)) LIMIT ?
|
46
|
+
|
47
|
+
This extension scans the logged SQL for numbers and strings,
|
48
|
+
attempting to support the database's rules for string quoting. This
|
49
|
+
means it should work with SQL that Sequel didn't itself create.
|
50
|
+
However, there are corner cases that the extension doesn't handle,
|
51
|
+
such as the use of apostrophes inside quoted identifiers, and
|
52
|
+
potentially other cases of database specific SQL where the normal
|
53
|
+
string quoting rules are changed, such as the use of escape strings
|
54
|
+
on PostgreSQL (E'escape string').
|
55
|
+
|
56
|
+
* A :before_preconnect Database option has been added. This is useful
|
57
|
+
for configuring extensions added via :preconnect_extensions before
|
58
|
+
the connection takes place.
|
59
|
+
|
60
|
+
= Other Improvements
|
61
|
+
|
62
|
+
* Dataset#columns! now uses a LIMIT 0 query instead of a LIMIT 1 query
|
63
|
+
by default. This can improve performance in cases where the row
|
64
|
+
returned would be large. Some databases do not support a LIMIT 0
|
65
|
+
query, and some adapters that ship with Sequel have been updated to
|
66
|
+
continue using LIMIT 1. Custom adapters should be updated to use
|
67
|
+
LIMIT 1 if the database does not support LIMIT 0.
|
68
|
+
|
69
|
+
* The lazy_attributes plugin no longer modifies the database schema.
|
70
|
+
Previously, it could modify the database schema indirectly,
|
71
|
+
resulting in the loss of typecasting for models that were not
|
72
|
+
based on a single table or view, such as usage with the
|
73
|
+
class_table_inheritance plugin.
|
74
|
+
|
75
|
+
* Model#freeze in the composition, serialization, and
|
76
|
+
serialization_modification_detection plugins now returns self. In
|
77
|
+
addition to being more correct, this fixes usage of these plugins
|
78
|
+
with the static_cache plugin.
|
@@ -0,0 +1,47 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* On PostgreSQL 14+, Dataset#with_recursive now supports :search and
|
4
|
+
:cycle options for result ordering and cycle detection. These use
|
5
|
+
the SEARCH and CYCLE clauses added in PostgreSQL 14:
|
6
|
+
|
7
|
+
DB[:t].with_recursive(:t,
|
8
|
+
DB[:i1].where(parent_id: nil),
|
9
|
+
DB[:i1].join(:t, id: :parent_id).select_all(:i1),
|
10
|
+
search: {by: :id, type: :breadth},
|
11
|
+
cycle: {columns: :id, cycle_value: 1, noncycle_value: 2})
|
12
|
+
|
13
|
+
# WITH RECURSIVE t AS (
|
14
|
+
# SELECT * FROM i1 WHERE (parent_id IS NULL)
|
15
|
+
# UNION ALL
|
16
|
+
# (SELECT i1.* FROM i1 INNER JOIN t ON (t.id = i1.parent_id))
|
17
|
+
# )
|
18
|
+
# SEARCH BREADTH FIRST BY id SET ordercol
|
19
|
+
# CYCLE id SET is_cycle TO 1 DEFAULT 2 USING path
|
20
|
+
|
21
|
+
* On MySQL, column schema hashes now contain an :extra entry, which
|
22
|
+
contains the Extra string returned in MySQL's DESCRIBE results
|
23
|
+
for the column.
|
24
|
+
|
25
|
+
= Other Improvements
|
26
|
+
|
27
|
+
* When eager loading via the tactical_eager_loading plugin, objects
|
28
|
+
that already have an association loaded will not have it reloaded
|
29
|
+
unless the :eager_reload option is given.
|
30
|
+
|
31
|
+
* When cloning an association and using a different :class option
|
32
|
+
than the cloned association, the :class option given when cloning
|
33
|
+
will now take precedence over the :class option for the cloned
|
34
|
+
association.
|
35
|
+
|
36
|
+
* When using the mock postgres adapter, the adapter defaults to
|
37
|
+
supporting PostgreSQL 14 (previously, it defaulted to supporting
|
38
|
+
PostgreSQL 9.5).
|
39
|
+
|
40
|
+
* Sequel now avoids a method redefined warning in the lazy attributes
|
41
|
+
plugin in verbose warnings mode.
|
42
|
+
|
43
|
+
= Other
|
44
|
+
|
45
|
+
* Sequel's primary discussion forum is now GitHub Discussions. The
|
46
|
+
sequel-talk Google Group is still available for users who would
|
47
|
+
prefer to use that instead.
|
@@ -0,0 +1,87 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* When the sql_comments Database extension is used,
|
4
|
+
Database#with_comments is now added, which can be used for including
|
5
|
+
comments for all queries executed inside a given block. This can
|
6
|
+
be useful if you want to analyze database query logs, and want to
|
7
|
+
group all related queries:
|
8
|
+
|
9
|
+
DB.with_comments(model: Album, action: :all) do
|
10
|
+
DB[:albums].all
|
11
|
+
# SELECT * FROM albums -- model:Album,action:all
|
12
|
+
end
|
13
|
+
|
14
|
+
* An sql_comments plugin has been added, which will automatically
|
15
|
+
add SQL comments for all queries generated by model class, instance
|
16
|
+
and dataset methods:
|
17
|
+
|
18
|
+
Album.plugin :sql_comments
|
19
|
+
|
20
|
+
album = Album[1]
|
21
|
+
# SELECT * FROM albums WHERE (id = 1) LIMIT 1
|
22
|
+
# -- model:Album,method_type:class,method:[]
|
23
|
+
|
24
|
+
album.update(:name=>'A')
|
25
|
+
# UPDATE albums SET name = 'baz' WHERE (id = 1)
|
26
|
+
# -- model:Album,method_type:instance,method:update
|
27
|
+
|
28
|
+
Album.where(id: 1).delete
|
29
|
+
# DELETE FROM albums WHERE (id = 1)
|
30
|
+
# -- model:Album,method_type:dataset,method:delete
|
31
|
+
|
32
|
+
This plugin requires you have loaded the sql_comments Database
|
33
|
+
extension into the related Database before use.
|
34
|
+
|
35
|
+
* A date_parse_input_handler extension has been added to support
|
36
|
+
custom handling of input to date parsing methods. Among other
|
37
|
+
things, you can use this to limit the length of strings that
|
38
|
+
will be parsed, which can prevent ArgumentErrors in newer Ruby
|
39
|
+
versions:
|
40
|
+
|
41
|
+
Sequel.extension :date_parse_input_handler
|
42
|
+
Sequel.date_parse_input_handler do |string|
|
43
|
+
string.b[0, 128]
|
44
|
+
end
|
45
|
+
|
46
|
+
= Other Improvements
|
47
|
+
|
48
|
+
* On Ruby 3.1, the core_refinements extension now avoids the
|
49
|
+
deprecated Refinement#include, switching to
|
50
|
+
Refinement#import_methods.
|
51
|
+
|
52
|
+
* On Ruby 3.1, the subclasses plugin will use Ruby's native support
|
53
|
+
for Class#subclasses.
|
54
|
+
|
55
|
+
* The subclasses plugin has renamed descendents to descendants and
|
56
|
+
freeze_descendents to freeze_descendants. The previous method
|
57
|
+
names are still available as aliases.
|
58
|
+
|
59
|
+
* The :ruby_default schema entry for datetime/timestamp columns now
|
60
|
+
respects Sequel.datetime_class. Previously, the value for the
|
61
|
+
:ruby_default schema entry would always be a DateTime value for
|
62
|
+
such columns.
|
63
|
+
|
64
|
+
* The pg_interval extension now works with ActiveSupport 7.0.
|
65
|
+
|
66
|
+
* The shared postgres adapter now respects
|
67
|
+
Database#default_string_column_size for setting the size of string
|
68
|
+
columns that don't use text as the database type.
|
69
|
+
|
70
|
+
* Database#supports_check_constraints? now returns true on MySQL
|
71
|
+
8.0.19+. This fixes drop_constraint in certain cases when combining
|
72
|
+
the constraint dropping with other changes in the same alter_table
|
73
|
+
block.
|
74
|
+
|
75
|
+
* The mysql adapter now supports the ruby-mysql 3 API (ruby-mysql
|
76
|
+
is a pure-ruby MySQL driver).
|
77
|
+
|
78
|
+
* The mysql adapter no longer uses the connection's server_version
|
79
|
+
method if it is defined, as the method does not return the
|
80
|
+
correct value when using the ruby-mysql driver with MariaDB.
|
81
|
+
|
82
|
+
* Comments added by the sql_comments extension no longer modify
|
83
|
+
cached SQL for a dataset.
|
84
|
+
|
85
|
+
= Other
|
86
|
+
|
87
|
+
* This is Sequel's 250th release!
|
@@ -0,0 +1,23 @@
|
|
1
|
+
= Improvements
|
2
|
+
|
3
|
+
* The jdbc/h2 subadapter now supports H2 version 2.0. It continues to
|
4
|
+
support H2 versions 1.3 and 1.4.
|
5
|
+
|
6
|
+
* The mysql2 adapter's prepared statement support now reuses existing
|
7
|
+
native prepared statements, instead of only binding variables on
|
8
|
+
newly prepared statements. This was the intended behavior
|
9
|
+
previously, and should result in increased performance in cases
|
10
|
+
where preparing a query takes significant time.
|
11
|
+
|
12
|
+
* The subclasses plugin now ignores an existing Class#subclasses
|
13
|
+
method if it is defined in Ruby. This fixes cases where usage of
|
14
|
+
ActiveSupport would break the subclasses plugin.
|
15
|
+
|
16
|
+
* Database#call_sproc in the jdbc adapter will now always close the
|
17
|
+
prepared call it creates. Before, if there was an exception raised
|
18
|
+
when setting the arguments for the prepared call, the prepared call
|
19
|
+
would not be closed.
|
20
|
+
|
21
|
+
* A more appropriate error is now issued if you try to use the
|
22
|
+
column_encryption plugin to encrypt a column without setting up an
|
23
|
+
encryption key.
|