sequel 5.83.1 → 5.85.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/sequel/adapters/shared/sqlite.rb +3 -1
- data/lib/sequel/connection_pool.rb +2 -2
- data/lib/sequel/database/schema_methods.rb +2 -0
- data/lib/sequel/dataset/actions.rb +9 -1
- data/lib/sequel/extensions/dataset_run.rb +41 -0
- data/lib/sequel/extensions/pg_json_ops.rb +642 -9
- data/lib/sequel/sql.rb +8 -5
- data/lib/sequel/version.rb +2 -2
- metadata +4 -237
- data/CHANGELOG +0 -1397
- data/README.rdoc +0 -936
- data/doc/advanced_associations.rdoc +0 -884
- data/doc/association_basics.rdoc +0 -1859
- data/doc/bin_sequel.rdoc +0 -146
- data/doc/cheat_sheet.rdoc +0 -255
- data/doc/code_order.rdoc +0 -104
- data/doc/core_extensions.rdoc +0 -405
- data/doc/dataset_basics.rdoc +0 -96
- data/doc/dataset_filtering.rdoc +0 -222
- data/doc/extensions.rdoc +0 -77
- data/doc/fork_safety.rdoc +0 -84
- data/doc/mass_assignment.rdoc +0 -98
- data/doc/migration.rdoc +0 -660
- data/doc/model_dataset_method_design.rdoc +0 -129
- data/doc/model_hooks.rdoc +0 -254
- data/doc/model_plugins.rdoc +0 -270
- data/doc/mssql_stored_procedures.rdoc +0 -43
- data/doc/object_model.rdoc +0 -563
- data/doc/opening_databases.rdoc +0 -439
- data/doc/postgresql.rdoc +0 -611
- data/doc/prepared_statements.rdoc +0 -144
- data/doc/querying.rdoc +0 -1070
- data/doc/reflection.rdoc +0 -120
- data/doc/release_notes/5.0.0.txt +0 -159
- data/doc/release_notes/5.1.0.txt +0 -31
- data/doc/release_notes/5.10.0.txt +0 -84
- data/doc/release_notes/5.11.0.txt +0 -83
- data/doc/release_notes/5.12.0.txt +0 -141
- data/doc/release_notes/5.13.0.txt +0 -27
- data/doc/release_notes/5.14.0.txt +0 -63
- data/doc/release_notes/5.15.0.txt +0 -39
- data/doc/release_notes/5.16.0.txt +0 -110
- data/doc/release_notes/5.17.0.txt +0 -31
- data/doc/release_notes/5.18.0.txt +0 -69
- data/doc/release_notes/5.19.0.txt +0 -28
- data/doc/release_notes/5.2.0.txt +0 -33
- data/doc/release_notes/5.20.0.txt +0 -89
- data/doc/release_notes/5.21.0.txt +0 -87
- data/doc/release_notes/5.22.0.txt +0 -48
- data/doc/release_notes/5.23.0.txt +0 -56
- data/doc/release_notes/5.24.0.txt +0 -56
- data/doc/release_notes/5.25.0.txt +0 -32
- data/doc/release_notes/5.26.0.txt +0 -35
- data/doc/release_notes/5.27.0.txt +0 -21
- data/doc/release_notes/5.28.0.txt +0 -16
- data/doc/release_notes/5.29.0.txt +0 -22
- data/doc/release_notes/5.3.0.txt +0 -121
- data/doc/release_notes/5.30.0.txt +0 -20
- data/doc/release_notes/5.31.0.txt +0 -148
- data/doc/release_notes/5.32.0.txt +0 -46
- data/doc/release_notes/5.33.0.txt +0 -24
- data/doc/release_notes/5.34.0.txt +0 -40
- data/doc/release_notes/5.35.0.txt +0 -56
- data/doc/release_notes/5.36.0.txt +0 -60
- data/doc/release_notes/5.37.0.txt +0 -30
- data/doc/release_notes/5.38.0.txt +0 -28
- data/doc/release_notes/5.39.0.txt +0 -19
- data/doc/release_notes/5.4.0.txt +0 -80
- data/doc/release_notes/5.40.0.txt +0 -40
- data/doc/release_notes/5.41.0.txt +0 -25
- data/doc/release_notes/5.42.0.txt +0 -136
- data/doc/release_notes/5.43.0.txt +0 -98
- data/doc/release_notes/5.44.0.txt +0 -32
- data/doc/release_notes/5.45.0.txt +0 -34
- data/doc/release_notes/5.46.0.txt +0 -87
- data/doc/release_notes/5.47.0.txt +0 -59
- data/doc/release_notes/5.48.0.txt +0 -14
- data/doc/release_notes/5.49.0.txt +0 -59
- data/doc/release_notes/5.5.0.txt +0 -61
- data/doc/release_notes/5.50.0.txt +0 -78
- data/doc/release_notes/5.51.0.txt +0 -47
- data/doc/release_notes/5.52.0.txt +0 -87
- data/doc/release_notes/5.53.0.txt +0 -23
- data/doc/release_notes/5.54.0.txt +0 -27
- data/doc/release_notes/5.55.0.txt +0 -21
- data/doc/release_notes/5.56.0.txt +0 -51
- data/doc/release_notes/5.57.0.txt +0 -23
- data/doc/release_notes/5.58.0.txt +0 -31
- data/doc/release_notes/5.59.0.txt +0 -73
- data/doc/release_notes/5.6.0.txt +0 -31
- data/doc/release_notes/5.60.0.txt +0 -22
- data/doc/release_notes/5.61.0.txt +0 -43
- data/doc/release_notes/5.62.0.txt +0 -132
- data/doc/release_notes/5.63.0.txt +0 -33
- data/doc/release_notes/5.64.0.txt +0 -50
- data/doc/release_notes/5.65.0.txt +0 -21
- data/doc/release_notes/5.66.0.txt +0 -24
- data/doc/release_notes/5.67.0.txt +0 -32
- data/doc/release_notes/5.68.0.txt +0 -61
- data/doc/release_notes/5.69.0.txt +0 -26
- data/doc/release_notes/5.7.0.txt +0 -108
- data/doc/release_notes/5.70.0.txt +0 -35
- data/doc/release_notes/5.71.0.txt +0 -21
- data/doc/release_notes/5.72.0.txt +0 -33
- data/doc/release_notes/5.73.0.txt +0 -66
- data/doc/release_notes/5.74.0.txt +0 -45
- data/doc/release_notes/5.75.0.txt +0 -35
- data/doc/release_notes/5.76.0.txt +0 -86
- data/doc/release_notes/5.77.0.txt +0 -63
- data/doc/release_notes/5.78.0.txt +0 -67
- data/doc/release_notes/5.79.0.txt +0 -28
- data/doc/release_notes/5.8.0.txt +0 -170
- data/doc/release_notes/5.80.0.txt +0 -40
- data/doc/release_notes/5.81.0.txt +0 -31
- data/doc/release_notes/5.82.0.txt +0 -61
- data/doc/release_notes/5.83.0.txt +0 -56
- data/doc/release_notes/5.9.0.txt +0 -99
- data/doc/schema_modification.rdoc +0 -679
- data/doc/security.rdoc +0 -443
- data/doc/sharding.rdoc +0 -286
- data/doc/sql.rdoc +0 -648
- data/doc/testing.rdoc +0 -204
- data/doc/thread_safety.rdoc +0 -15
- data/doc/transactions.rdoc +0 -250
- data/doc/validations.rdoc +0 -558
- data/doc/virtual_rows.rdoc +0 -265
data/doc/reflection.rdoc
DELETED
@@ -1,120 +0,0 @@
|
|
1
|
-
= Reflection
|
2
|
-
|
3
|
-
Sequel supports reflection information in multiple ways.
|
4
|
-
|
5
|
-
== Adapter in Use
|
6
|
-
|
7
|
-
You can get the adapter in use using Database#adapter_scheme:
|
8
|
-
|
9
|
-
DB.adapter_scheme # :postgres, :jdbc, :odbc
|
10
|
-
|
11
|
-
== Database Connected To
|
12
|
-
|
13
|
-
In some cases, the adapter scheme will be the same as the database to which you are connecting. However, many adapters support multiple databases. You can use the Database#database_type method to get the type of database to which you are connecting:
|
14
|
-
|
15
|
-
DB.database_type # :postgres, :h2, :mssql
|
16
|
-
|
17
|
-
== Tables in the Database
|
18
|
-
|
19
|
-
Database#tables gives an array of table name symbols:
|
20
|
-
|
21
|
-
DB.tables # [:table1, :table2, :table3, ...]
|
22
|
-
|
23
|
-
== Views in the Database
|
24
|
-
|
25
|
-
Database#views and gives an array of view name symbols:
|
26
|
-
|
27
|
-
DB.views # [:view1, :view2, :view3, ...]
|
28
|
-
|
29
|
-
== Indexes on a table
|
30
|
-
|
31
|
-
Database#indexes takes a table name gives a hash of index information. Keys are index names, values are subhashes with the keys :columns and :unique :
|
32
|
-
|
33
|
-
DB.indexes(:table1) # {:index1=>{:columns=>[:column1], :unique=>false}, :index2=>{:columns=>[:column2, :column3], :unique=>true}}
|
34
|
-
|
35
|
-
Index information generally does not include partial indexes, functional indexes, or indexes on the primary key of the table.
|
36
|
-
|
37
|
-
== Foreign Key Information for a Table
|
38
|
-
|
39
|
-
Database#foreign_key_list takes a table name and gives an array of hashes of foreign key information:
|
40
|
-
|
41
|
-
DB.foreign_key_list(:table1) # [{:columns=>[:column1], :table=>:referenced_table, :key=>[:referenced_column1]}]
|
42
|
-
|
43
|
-
At least the following entries will be present in the hash:
|
44
|
-
|
45
|
-
:columns :: An array of columns in the given table
|
46
|
-
:table :: The table referenced by the columns
|
47
|
-
:key :: An array of columns referenced (in the table specified by :table), but can be nil on certain adapters
|
48
|
-
if the primary key is referenced.
|
49
|
-
|
50
|
-
The hash may also contain entries for:
|
51
|
-
|
52
|
-
:deferrable :: Whether the constraint is deferrable
|
53
|
-
:name :: The name of the constraint
|
54
|
-
:on_delete :: The action to take ON DELETE
|
55
|
-
:on_update :: The action to take ON UPDATE
|
56
|
-
|
57
|
-
== Column Information for a Table
|
58
|
-
|
59
|
-
Database#schema takes a table symbol and returns column information in an array with each element being an array with two elements. The first elements of the subarray is a column symbol, and the second element is a hash of information about that column. The hash should include the following keys:
|
60
|
-
|
61
|
-
:allow_null :: Whether NULL/nil is an allowed value for this column. Used by the Sequel::Model typecasting code.
|
62
|
-
:db_type :: The type of column the database provided, as a string. Used by the schema_dumper plugin for a more specific type translation.
|
63
|
-
:default :: The default value of the column, as either a string or nil. Uses a database specific format. Used by the schema_dumper plugin for converting to a ruby value.
|
64
|
-
:primary_key :: Whether this column is one of the primary key columns for the table. Used by the Sequel::Model code to determine primary key columns.
|
65
|
-
:ruby_default :: The default value of the column as a ruby object, or nil if there is no default or the default could not be successfully parsed into a ruby object.
|
66
|
-
:type :: The type of column, as a symbol (e.g. :string). Used by the Sequel::Model typecasting code.
|
67
|
-
|
68
|
-
Example:
|
69
|
-
|
70
|
-
DB.schema(:table) # [[:column1, {:allow_null=>true, :db_type=>'varchar(255)', :default=>'blah', :primary_key=>false, :type=>:string}], ...]
|
71
|
-
|
72
|
-
== Column Information for a Model
|
73
|
-
|
74
|
-
Model#db_schema returns pretty much the same information, except it returns it as a hash with column keys instead of an array of two element arrays.
|
75
|
-
|
76
|
-
Model.db_schema # {:column1=>{:allow_null=>true, :db_type=>'varchar(255)', :default=>'blah', :primary_key=>false, :type=>:string}, ...}
|
77
|
-
|
78
|
-
== Columns used by a dataset/model
|
79
|
-
|
80
|
-
Dataset#columns returns the columns of the current dataset as an array of symbols:
|
81
|
-
|
82
|
-
DB[:table].columns # [:column1, :column2, :column3, ...]
|
83
|
-
|
84
|
-
Dataset#columns! does the same thing, except it ignores any cached value. In general, the cached value should never be incorrect, unless the database schema is changed after the dataset is created.
|
85
|
-
|
86
|
-
DB[:table].columns! # [:column1, :column2, :column3, ...]
|
87
|
-
|
88
|
-
Model.columns does the same thing as Dataset#columns, using the model's dataset:
|
89
|
-
|
90
|
-
Model.columns # [:column1, :column2, :column3, ...]
|
91
|
-
|
92
|
-
== Associations Defined
|
93
|
-
|
94
|
-
Sequel::Model offers complete introspection capability for all associations.
|
95
|
-
|
96
|
-
You can get an array of association symbols with Model.associations:
|
97
|
-
|
98
|
-
Model.associations # [:association1, :association2, ...]
|
99
|
-
|
100
|
-
You can get the association reflection for a single association via the Model.association_reflection. Association reflections are subclasses of hash:
|
101
|
-
|
102
|
-
Model.association_reflection(:association1) # #<Sequel::Model::Associations::ManyToOneAssociationReflection Model.many_to_one :association1>
|
103
|
-
|
104
|
-
You can get an array of all association reflections via Model.all_association_reflections:
|
105
|
-
|
106
|
-
Model.all_association_reflections # [#<Sequel::Model::Associations::ManyToOneAssociationReflection Model.many_to_one :association1>, ...]
|
107
|
-
|
108
|
-
Finally, you can get a hash of association reflections via Model.association_reflections:
|
109
|
-
|
110
|
-
Model.association_reflections # {:association1=>#<Sequel::Model::Associations::ManyToOneAssociationReflection Model.many_to_one :association1>, ...}
|
111
|
-
|
112
|
-
== Validations Defined
|
113
|
-
|
114
|
-
When using the validation_class_methods plugin, you can use the validation_reflections class method to get a hash with validation reflection information. This returns a hash keyed on the column name symbol:
|
115
|
-
|
116
|
-
Model.validation_reflections[:column] # => [[:presence, {}], [:length, {:maximum=>255, :message=>'is just too long'}]]
|
117
|
-
|
118
|
-
Similarly, when using the constraint_validations plugin, you can use the constraint_validation_reflections class method:
|
119
|
-
|
120
|
-
Model.constraint_validation_reflections[:column] # => [[:presence, {}], [:max_length, {:argument=>255, :message=>'is just too long'}]]
|
data/doc/release_notes/5.0.0.txt
DELETED
@@ -1,159 +0,0 @@
|
|
1
|
-
= Major Changes
|
2
|
-
|
3
|
-
* Datasets are now frozen by default. Since Sequel's inception,
|
4
|
-
datasets have used a method-chaining API that returned modified
|
5
|
-
copies, but previously they still supported direct mutation. Now,
|
6
|
-
datasets are always frozen and cannot be mutated. This allows many
|
7
|
-
additional default optimizations related to caching, and provides
|
8
|
-
greater thread safety.
|
9
|
-
|
10
|
-
ds = DB[:table]
|
11
|
-
|
12
|
-
# Before
|
13
|
-
ds.row_proc = lambda{|h| h}
|
14
|
-
|
15
|
-
# Now
|
16
|
-
ds = ds.with_row_proc(lambda{|h| h})
|
17
|
-
|
18
|
-
* Symbol splitting to create qualified and/or aliased identifiers is
|
19
|
-
now disabled by default. While symbol splitting allowed for shorter
|
20
|
-
code, it was not obvious and caused significant issues when using
|
21
|
-
column names with embedded double or triple underscores. Sequel now
|
22
|
-
offers many ways to create qualified and/or aliased identifiers.
|
23
|
-
|
24
|
-
# Before
|
25
|
-
:table__column # "table"."column"
|
26
|
-
|
27
|
-
# Now
|
28
|
-
:table__column # "table__column"
|
29
|
-
Sequel[:table][:column] # "table"."column"
|
30
|
-
|
31
|
-
# To get back historical behavior
|
32
|
-
Sequel.split_symbols = true
|
33
|
-
|
34
|
-
* Sequel no longer allows the use of plain ruby strings as SQL code
|
35
|
-
fragments in the dataset filtering methods, as that makes it
|
36
|
-
easier to introduce SQL injection vulnerabilities. You can use
|
37
|
-
Sequel.lit to create literal strings (SQL code fragments), which
|
38
|
-
makes it easier to do security auditing of applications using
|
39
|
-
Sequel.
|
40
|
-
|
41
|
-
# Before
|
42
|
-
DB[:table].where("column = 1").all
|
43
|
-
|
44
|
-
# Now
|
45
|
-
DB[:table].where(Sequel.lit("column = 1")).all
|
46
|
-
# or better
|
47
|
-
DB[:table].where(column: 1).all
|
48
|
-
|
49
|
-
# To get back historical behavior
|
50
|
-
DB.extension :auto_literal_strings
|
51
|
-
|
52
|
-
= Backwards Compatibility
|
53
|
-
|
54
|
-
* All adapters, extensions, plugins, features, and constants
|
55
|
-
deprecated in 4.49.0 have been removed. Before upgrading to Sequel
|
56
|
-
5.0.0, upgrade to 4.49.0 and fix all deprecation warnings.
|
57
|
-
|
58
|
-
* Support for ruby 1.8.7 has been dropped, the minimum ruby version is
|
59
|
-
now 1.9.2.
|
60
|
-
|
61
|
-
* The {before,after,around}_validation hooks are now always called
|
62
|
-
when saving, even if the validate: false option is used. This
|
63
|
-
allows you to use the before_validation hook to make changes
|
64
|
-
to the model instance that are required before validation and
|
65
|
-
before saving even if not validating.
|
66
|
-
|
67
|
-
* Getting column values for newly created model instances after
|
68
|
-
insertion now happens before after_create is called, instead of
|
69
|
-
after.
|
70
|
-
|
71
|
-
* Sequel now immediately attempts to the connect to the database
|
72
|
-
when a Database instance is created, in order to fail fast if the
|
73
|
-
connection parameters are invalid.
|
74
|
-
|
75
|
-
* The validates_unique method in the validation_helpers plugin
|
76
|
-
now only checks for uniqueness by default if the record is new or
|
77
|
-
one of the related columns has been modified by default.
|
78
|
-
|
79
|
-
* Database schema modification methods and schema generator methods
|
80
|
-
now return nil instead of some internal value.
|
81
|
-
|
82
|
-
* Many cases where Sequel used Kernel#send internally have been
|
83
|
-
switched to Kernel#public_send so they only call public methods.
|
84
|
-
|
85
|
-
* Model association hooks are now nil instead of empty arrays by
|
86
|
-
default.
|
87
|
-
|
88
|
-
* Internal uses of instance_eval with a block have been changed to
|
89
|
-
instance_exec. This allows them to be used with lambdas that
|
90
|
-
take no arguments.
|
91
|
-
|
92
|
-
* Most internal constants are now frozen, unless there is a
|
93
|
-
requirement that they be modified at runtime.
|
94
|
-
|
95
|
-
* The Model @was_new instance variable is now no longer set when
|
96
|
-
saving new model instances.
|
97
|
-
|
98
|
-
* The private Sequel::Postgres::PGArray::Parser#new_entry_buffer
|
99
|
-
method in the pg_array extension has been removed.
|
100
|
-
|
101
|
-
* Modifying Model.input_transformer_order in the input_transformer
|
102
|
-
plugin no longer has an effect.
|
103
|
-
|
104
|
-
= New Features
|
105
|
-
|
106
|
-
* Database#add_index :if_not_exists option is now supported on
|
107
|
-
PostgreSQL 9.5+.
|
108
|
-
|
109
|
-
* SQL::Subscript#expression has been added to retrieve the
|
110
|
-
expression that is subscripted.
|
111
|
-
|
112
|
-
= Other Improvements
|
113
|
-
|
114
|
-
* Threaded connection pools no longer block while new connections
|
115
|
-
are being made. Previously, attempting to establish a new
|
116
|
-
connection blocked all connection pool activity until the new
|
117
|
-
connection was made.
|
118
|
-
|
119
|
-
* Many minor performance improvements have been made.
|
120
|
-
|
121
|
-
* The class_table_inheritance plugin now raises an error during
|
122
|
-
Model#update if a query does not modify a single row, just as
|
123
|
-
the default Model#update does.
|
124
|
-
|
125
|
-
* ConnectionPool#size is now thread-safe in both threaded
|
126
|
-
connection pools. Internal callers that already have the
|
127
|
-
connection pool mutex should switch to using #_size (a new
|
128
|
-
private method).
|
129
|
-
|
130
|
-
* Registration of new serialization formats in the serialization
|
131
|
-
plugin is now thread-safe.
|
132
|
-
|
133
|
-
* If transactional schema modifications are not supported, a
|
134
|
-
savepoint will not automatically be created when adding
|
135
|
-
indexes for new tables inside transactions. This fixes issues
|
136
|
-
when making schema changes inside transactions on MySQL.
|
137
|
-
|
138
|
-
* Attempting to create a prepared statement using a dataset that
|
139
|
-
uses a delayed evaluation now raises an error, because the
|
140
|
-
prepared statement would not respect the delayed evaluation.
|
141
|
-
|
142
|
-
* The bin/sequel -M option now uses base 10. Previously, it
|
143
|
-
used the Kernel#Integer default, which was base 8 if there was
|
144
|
-
a preceding 0.
|
145
|
-
|
146
|
-
= Deprecated Features
|
147
|
-
|
148
|
-
These deprecated features will be removed in Sequel 5.1.0.
|
149
|
-
|
150
|
-
* Model.allowed_columns in the base plugin is now deprecated. Use
|
151
|
-
the whitelist_security plugin if you want to call it.
|
152
|
-
|
153
|
-
* Model use_after_commit_rollback class and instance accessors are
|
154
|
-
now deprecated.
|
155
|
-
|
156
|
-
* Defining the Model#_before_validation method is now deprecated.
|
157
|
-
You can change to using before_validation.
|
158
|
-
|
159
|
-
* The private Model.plugin_module_defined? method is now deprecated.
|
data/doc/release_notes/5.1.0.txt
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
= Improvements
|
2
|
-
|
3
|
-
* Database#copy_into in the jdbc/postgresql adapter now works
|
4
|
-
correctly when using multibyte characters in strings.
|
5
|
-
|
6
|
-
* The alter_table add_foreign_key method is now reversible when the
|
7
|
-
:foreign_key_constraint_name option is used.
|
8
|
-
|
9
|
-
* The jdbc/h2 and jdbc/hsqldb adapters now respect the
|
10
|
-
:foreign_key_constraint_name option.
|
11
|
-
|
12
|
-
* Calling Model.freeze on an already frozen model no longer raises
|
13
|
-
an error.
|
14
|
-
|
15
|
-
* An unnecessary database query is now avoided when loading the
|
16
|
-
pg_inet extension when the pg_array extension is already loaded.
|
17
|
-
|
18
|
-
* A better exception message is now used when migrating with an
|
19
|
-
empty migration directory.
|
20
|
-
|
21
|
-
= Backwards Compatibility
|
22
|
-
|
23
|
-
* Model.allowed_columns has been removed. Use the whitelist_security
|
24
|
-
plugin if you want to call it.
|
25
|
-
|
26
|
-
* Model use_after_commit_rollback class and instance accessors have
|
27
|
-
been removed.
|
28
|
-
|
29
|
-
* Support for the Model#_before_validation method has been removed.
|
30
|
-
|
31
|
-
* The private Model.plugin_module_defined? method has been removed.
|
@@ -1,84 +0,0 @@
|
|
1
|
-
= New Features
|
2
|
-
|
3
|
-
* Ruby 2.6+ endless ranges are now supported as condition specifier
|
4
|
-
values, using a >= operator for them:
|
5
|
-
|
6
|
-
DB[:t].where(c: 1...)
|
7
|
-
# SELECT * FROM t WHERE (c >= 1)
|
8
|
-
|
9
|
-
* Ruby 2.6+ endless ranges are now supported in the pg_range
|
10
|
-
extension:
|
11
|
-
|
12
|
-
DB[:t].where(id: 1).update(r: 1...)
|
13
|
-
# UPDATE t SET r = '[1,)' WHERE (id = 1)
|
14
|
-
|
15
|
-
* The :include option when creating indexes is now supported on
|
16
|
-
PostgreSQL 11, specifying additional columns to include in the index
|
17
|
-
without indexing them. This is useful to allow index only scans in
|
18
|
-
additional cases.
|
19
|
-
|
20
|
-
* The :tablespace option is now supported when creating tables,
|
21
|
-
indexes, and materialized views on PostgreSQL.
|
22
|
-
|
23
|
-
* The list plugin now supports a :top option, which can be used to
|
24
|
-
specify the top of the list. The default value for the top of the
|
25
|
-
list is 1, but using this option you can make the top of the list be
|
26
|
-
0.
|
27
|
-
|
28
|
-
= Other Improvements
|
29
|
-
|
30
|
-
* In the pg_array_associations plugin, filtering by associations for
|
31
|
-
many_to_pg_array associations now works correctly on PostgreSQL 11.
|
32
|
-
Previously it did not work on PostgreSQL 11 due to new restrictions
|
33
|
-
on using set returning functions in the the SELECT list.
|
34
|
-
|
35
|
-
* When setting the value of a column to the same value the column
|
36
|
-
already has, for a new model object that has not yet been persisted,
|
37
|
-
where the column is used as the foreign key for at least one
|
38
|
-
many_to_one association, do not clear any related associations from
|
39
|
-
the associations cache.
|
40
|
-
|
41
|
-
* In the pg_array extension, if there are separate conversion procs for
|
42
|
-
timetz and time types, the conversion proc for the timetz[] type now
|
43
|
-
correctly uses the conversion proc for the timetz type to convert
|
44
|
-
scalar values, instead of the conversion proc for the time type.
|
45
|
-
|
46
|
-
* Empty arrays and hashes are now correctly handled in
|
47
|
-
Dataset#{first,where_all,where_each,where_single_value} when a
|
48
|
-
cached placeholder literalizer is used.
|
49
|
-
|
50
|
-
* In the tree plugin, Model#{ancestors,descendants,self_and_siblings}
|
51
|
-
now work correctly when custom parent/children association names
|
52
|
-
are used.
|
53
|
-
|
54
|
-
* The inner loop of the postgres adapter row fetching code is now
|
55
|
-
2-3% faster.
|
56
|
-
|
57
|
-
* When using the postgres adapter with pg-0.18+, set a
|
58
|
-
type_map_for_queries for the connection to allow it to handle input
|
59
|
-
type casts for Integer, Float, TrueClass, and FalseClass values
|
60
|
-
without allocating strings.
|
61
|
-
|
62
|
-
* SQLTime.parse (and therefore Sequel.string_to_time) now respects the
|
63
|
-
SQLTime.date and Sequel.application_timezone settings.
|
64
|
-
|
65
|
-
* The jdbc/postgresql adapter now correctly parses timetz types.
|
66
|
-
|
67
|
-
* On JRuby 9.2.0.0, when handling BC timestamps without timezones in
|
68
|
-
the pg_extended_date_support extension, assume local time and not
|
69
|
-
UTC time if the database timezone is not specified and
|
70
|
-
Sequel.datetime_class is Time.
|
71
|
-
|
72
|
-
* Errors indicating that a MySQL database is in read-only mode are
|
73
|
-
now treated as disconnect errors in the mysql and mysql2 adapters,
|
74
|
-
for better behavior in failover scenarios.
|
75
|
-
|
76
|
-
* Sequel::Model datasets now support the use of IN/NOT IN operators
|
77
|
-
where the second argument for the operator (the right hand side) is
|
78
|
-
a set returning function. Previously, the Sequel::Model code
|
79
|
-
assumed the right hand side of an IN/NOT IN operator was a datasets
|
80
|
-
or array, since those are the only values where Sequel will
|
81
|
-
automatically create such an operator.
|
82
|
-
|
83
|
-
* Sequel no longer loads the strscan library in the pg_array extension
|
84
|
-
if it is not necessary because the parser from sequel_pg is used.
|
@@ -1,83 +0,0 @@
|
|
1
|
-
= New Features
|
2
|
-
|
3
|
-
* Sequel now supports more window frame specification types when
|
4
|
-
using window functions. You can now provide the window frame
|
5
|
-
specification as a hash, and Sequel will format the correct
|
6
|
-
SQL. Specifically, this adds support for RANGE and GROUPS,
|
7
|
-
numeric offsets, and EXCLUDE on a database that supports it
|
8
|
-
(e.g. PostgreSQL 11+). Examples:
|
9
|
-
|
10
|
-
DB[:albums].select{function(c1).over(:partition=>c2, :order=>:c3,
|
11
|
-
:frame=>{:type=>:range, :start=>1, :end=>1})}
|
12
|
-
# SELECT function(c1) OVER (PARTITION BY c2 ORDER BY c3
|
13
|
-
# RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING) FROM albums
|
14
|
-
|
15
|
-
DB[:albums].select{function(c1).over(:partition=>c2, :order=>:c3,
|
16
|
-
:frame=>{:type=>:groups, :start=>[2, :preceding], :end=>[1, :preceding]})}
|
17
|
-
# SELECT function(c1) OVER (PARTITION BY c2 ORDER BY c3
|
18
|
-
# GROUPS BETWEEN 2 PRECEDING AND 1 PRECEDING) FROM albums
|
19
|
-
|
20
|
-
DB[:albums].select{function(c1).over(:partition=>c2, :order=>:c3,
|
21
|
-
:frame=>{:type=>:range, :start=>:preceding, :exclude=>:current})}
|
22
|
-
# SELECT function(c1) OVER (PARTITION BY c2 ORDER BY c3
|
23
|
-
# RANGE UNBOUNDED PRECEDING EXCLUDE CURRENT ROW) FROM albums
|
24
|
-
|
25
|
-
* The SQLite 3.24+ ON CONFLICT clause to INSERT is now supported.
|
26
|
-
This support is very similar to the PostgreSQL support for the
|
27
|
-
same feature, also known as UPSERT (UPDATE if the row already
|
28
|
-
exists, INSERT if it does not). This support is different than
|
29
|
-
the previous support for INSERT ON CONFLICT REPLACE (also known as
|
30
|
-
INSERT OR REPLACE), but it uses the same method name in order to
|
31
|
-
be compatible with the PostgreSQL support. The new syntax requires
|
32
|
-
passing a hash to Dataset#insert_conflict. Examples:
|
33
|
-
|
34
|
-
DB[:table].insert_conflict({}).insert(a: 1, b: 2)
|
35
|
-
# INSERT INTO TABLE (a, b) VALUES (1, 2)
|
36
|
-
# ON CONFLICT DO NOTHING
|
37
|
-
|
38
|
-
DB[:table].insert_conflict(target: :a).insert(a: 1, b: 2)
|
39
|
-
# INSERT INTO TABLE (a, b) VALUES (1, 2)
|
40
|
-
# ON CONFLICT (a) DO NOTHING
|
41
|
-
|
42
|
-
DB[:table].insert_conflict(target: :a,
|
43
|
-
conflict_where: {c: true}).insert(a: 1, b: 2)
|
44
|
-
# INSERT INTO TABLE (a, b) VALUES (1, 2)
|
45
|
-
# ON CONFLICT (a) WHERE (c IS TRUE) DO NOTHING
|
46
|
-
|
47
|
-
DB[:table].insert_conflict(target: :a,
|
48
|
-
update: {b: Sequel[:excluded][:b]}).insert(a: 1, b: 2)
|
49
|
-
# INSERT INTO TABLE (a, b) VALUES (1, 2)
|
50
|
-
# ON CONFLICT (a) DO UPDATE SET b = excluded.b
|
51
|
-
|
52
|
-
DB[:table].insert_conflict(target: :a,
|
53
|
-
update: {b: Sequel[:excluded][:b]},
|
54
|
-
update_where: {Sequel[:table][:status_id] => 1}).insert(a: 1, b: 2)
|
55
|
-
# INSERT INTO TABLE (a, b) VALUES (1, 2) ON CONFLICT (a)
|
56
|
-
# DO UPDATE SET b = excluded.b WHERE (table.status_id = 1)
|
57
|
-
|
58
|
-
* Dataset#window for the WINDOW clause has been moved from the
|
59
|
-
PostgreSQL-specific support to core, and has been enabled on
|
60
|
-
MySQL 8+ and SQLAnywhere. This allows you to specify a shared
|
61
|
-
window specification in a query, which can be used by multiple
|
62
|
-
window functions.
|
63
|
-
|
64
|
-
= Other Improvements
|
65
|
-
|
66
|
-
* When using the static_cache plugin, Model.first when called without
|
67
|
-
a block and without arguments or with a single Integer argument now
|
68
|
-
uses the cached values instead of issuing a query.
|
69
|
-
|
70
|
-
* Using set_column_default with a nil value now correctly removes an
|
71
|
-
existing default value on MySQL when the column is NOT NULL.
|
72
|
-
|
73
|
-
* Window function support has been enabled on SQLAnywhere, since it
|
74
|
-
works correctly.
|
75
|
-
|
76
|
-
* Dumping schema for numeric/decimal columns with default values
|
77
|
-
now works correctly. This was broken starting in Sequel 5.9.0
|
78
|
-
due to changes to use BigDecimal() instead of BigDecimal.new().
|
79
|
-
|
80
|
-
* The jdbc/sqlserver adapter now works correctly on JRuby 9.2+.
|
81
|
-
|
82
|
-
* An additional check constraint violation failure message is now
|
83
|
-
recognized on SQLite.
|
@@ -1,141 +0,0 @@
|
|
1
|
-
= New Features
|
2
|
-
|
3
|
-
* An eager_graph_eager plugin has been added, which allows you to
|
4
|
-
chain eager loads using separate queries to an existing dataset that
|
5
|
-
uses eager_graph. Given the following model associations:
|
6
|
-
|
7
|
-
Band.one_to_many :albums
|
8
|
-
Album.one_to_many :tracks
|
9
|
-
|
10
|
-
Let's say you wanted to return bands ordered by album name, and
|
11
|
-
eagerly load those albums, you can do that using:
|
12
|
-
|
13
|
-
Band.eager_graph(:albums).order{albums[:name]}
|
14
|
-
|
15
|
-
Let's say you also wanted to eagerly load the tracks for each album.
|
16
|
-
You could just add them to the eager_graph call:
|
17
|
-
|
18
|
-
Band.eager_graph(albums: :tracks).order{albums[:name]}
|
19
|
-
|
20
|
-
However, the bloats the result set, and you aren't ordering by the
|
21
|
-
track information, so a join is not required. The eager_graph_eager
|
22
|
-
plugin allows you to specify that the tracks be eagerly loaded in a
|
23
|
-
separate query after the eager_graph load of albums:
|
24
|
-
|
25
|
-
Band.eager_graph(:albums).
|
26
|
-
eager_graph_eager([:albums], :tracks).
|
27
|
-
order{albums[:name]}
|
28
|
-
|
29
|
-
eager_graph_eager's first argument is a dependency chain, specified
|
30
|
-
as an array of symbols. This specifies the point at which to
|
31
|
-
perform the eager load. The remaining arguments are arguments that
|
32
|
-
could be passed to Dataset#eager to specify what dependent
|
33
|
-
associations should be loaded at that point.
|
34
|
-
|
35
|
-
* A caller_logging Database extension has been added, which logs
|
36
|
-
caller information before queries, filtering out the internal
|
37
|
-
Sequel callers. Example:
|
38
|
-
|
39
|
-
DB.extension :caller_logging
|
40
|
-
DB[:table].first
|
41
|
-
# Logger:
|
42
|
-
# (0.000041s) (source: /path/to/app/foo/t.rb:12 in `get_first`)
|
43
|
-
# SELECT * FROM table LIMIT 1
|
44
|
-
|
45
|
-
You can further filter the caller lines by setting
|
46
|
-
Database#caller_logging_ignore to a regexp of additional caller
|
47
|
-
lines to ignore. This is useful if you have specific methods or
|
48
|
-
internal extensions/plugins that you would also like to ignore as
|
49
|
-
they obscure the code actually making the request.
|
50
|
-
|
51
|
-
DB.caller_logging_ignore = %r{/path/to/app/lib/plugins}
|
52
|
-
|
53
|
-
You can also format the caller before it is placed in the logger,
|
54
|
-
using caller_logging_formatter:
|
55
|
-
|
56
|
-
DB.caller_logging_formatter = lambda do |caller|
|
57
|
-
"(#{caller.sub(/\A\/path\/to\/app\//, '')})"
|
58
|
-
end
|
59
|
-
DB[:table].first
|
60
|
-
# Logger:
|
61
|
-
# (0.000041s) (foo/t.rb:12 in `get_first`) SELECT * FROM table LIMIT 1
|
62
|
-
|
63
|
-
* Database#call_procedure has been added to the postgres adapter, and
|
64
|
-
is usable on PostgreSQL 11+ for calling procedures created with
|
65
|
-
CREATE PROCEDURE.
|
66
|
-
|
67
|
-
DB.call_procedure(:foo, 1, "bar")
|
68
|
-
# CALL foo(1, 'bar')
|
69
|
-
|
70
|
-
This method will return a hash of results if the procedure returns
|
71
|
-
a result, or nil if it does not return a result.
|
72
|
-
|
73
|
-
= Other Improvements
|
74
|
-
|
75
|
-
* It is now possible to use Dataset#eager_graph in an eager load
|
76
|
-
callback for associations that use join tables. This allows you
|
77
|
-
to eager load some associations using separate queries and other
|
78
|
-
associations using joins. For example:
|
79
|
-
|
80
|
-
Band.eager(:albums=>proc{|ds| ds.eager_graph(:tracks)})
|
81
|
-
|
82
|
-
Will load the bands in one query, and load the albums and tracks
|
83
|
-
in a separate query using a join. Previously, this construction
|
84
|
-
worked only for associations that did not use join tables. It now
|
85
|
-
works for associations that use join tables, as long as existing
|
86
|
-
selected columns are not removed inside the callback.
|
87
|
-
|
88
|
-
* The tactical_eager_loading plugin now handles automatic eager
|
89
|
-
loading for associated objects that were created during the
|
90
|
-
load of dataset that uses eager_graph. When using the plugin,
|
91
|
-
the following code will now only execute 2 queries, instead of
|
92
|
-
issuing a separate query for each album to get the tracks for
|
93
|
-
the album.
|
94
|
-
|
95
|
-
artists = Artist.eager_graph(:albums).all
|
96
|
-
artists.each do |artist|
|
97
|
-
artist.albums.each do |album|
|
98
|
-
album.tracks
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
* Calling Dataset#graph with a dataset with existing selections where
|
103
|
-
the column aliases cannot be determined automatically now works
|
104
|
-
correctly by using a subselect. Previously, attempting to do this
|
105
|
-
would raise an exception. This allows the following code to work:
|
106
|
-
|
107
|
-
DB[:table].select_all(:table).select_append(expr).graph(...)
|
108
|
-
|
109
|
-
* Datasets now cache the EagerGraphLoader object that is generated to
|
110
|
-
convert arrays of hashes into an object graph, so that subsequent
|
111
|
-
eager loads on the same dataset do not need to recompute the same
|
112
|
-
information. Most EagerGraphLoader internal state is now frozen to
|
113
|
-
prevent unintentional modification.
|
114
|
-
|
115
|
-
* Sequel.extension now loads files from gems. Previously, it used
|
116
|
-
Kernel.require, which does not load files from gems.
|
117
|
-
|
118
|
-
* Adapters that emulate prepared statements using literalization now
|
119
|
-
use a placeholder literalizer and should execute significantly
|
120
|
-
faster. More prepared statement internal metadata is now frozen
|
121
|
-
to prevent unintentional modification.
|
122
|
-
|
123
|
-
* Dataset#intersect, #except, and #nowait are now supported on MariaDB
|
124
|
-
10.3+.
|
125
|
-
|
126
|
-
* The constraint_validations extension now respects the
|
127
|
-
constraint_validations_table setting when adding metadata for the
|
128
|
-
constraint validations.
|
129
|
-
|
130
|
-
* In the oracle adapter, the clob prepared statement argument type is
|
131
|
-
now mapped to the OCI8::CLOB class, allowing the use of Oracle
|
132
|
-
procedures with clob output parameters.
|
133
|
-
|
134
|
-
* The Model.load_cache method in the static_cache plugin is now public.
|
135
|
-
|
136
|
-
= Backwards Compatibility
|
137
|
-
|
138
|
-
* The private Dataset#prepared_arg? method has been removed. It is no
|
139
|
-
longer necessary after the refactoring to the prepared statement
|
140
|
-
code. External adapters that currently call the method should be
|
141
|
-
updated to no longer call the method.
|
@@ -1,27 +0,0 @@
|
|
1
|
-
= New Features
|
2
|
-
|
3
|
-
* A constant_sql_override Database extension has been added, allowing
|
4
|
-
for overriding the SQL used by constants such as
|
5
|
-
Sequel::CURRENT_TIMESTAMP. This can be used to force
|
6
|
-
CURRENT_TIMESTAMP to be literalized at a particular time zone:
|
7
|
-
|
8
|
-
DB.extension :constant_sql_override
|
9
|
-
DB.set_constant_sql(Sequel::CURRENT_TIMESTAMP,
|
10
|
-
"CURRENT_TIMESTAMP AT TIME ZONE 'UTC'")
|
11
|
-
|
12
|
-
* Prepared statements now support the :single_value type, which
|
13
|
-
returns the first column value in the dataset.
|
14
|
-
|
15
|
-
prep_stmt = DB[:table].select(:column).prepare(:single_value, :ps)
|
16
|
-
prep_stmt.call
|
17
|
-
# PREPARE ps AS SELECT column FROM table LIMIT 1;
|
18
|
-
# EXECUTE ps;
|
19
|
-
# => 42
|
20
|
-
|
21
|
-
= Other Improvements
|
22
|
-
|
23
|
-
* Dataset#from_self will no longer use a cached dataset if any options
|
24
|
-
are given, as that can result in incorrect behavior.
|
25
|
-
|
26
|
-
* Model.all in the static_cache plugin now accepts a block, mirroring
|
27
|
-
the API when the static_cache plugin is not used.
|