sequel 4.36.0 → 5.61.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/CHANGELOG +548 -5749
- data/MIT-LICENSE +1 -1
- data/README.rdoc +265 -159
- data/bin/sequel +34 -12
- data/doc/advanced_associations.rdoc +228 -187
- data/doc/association_basics.rdoc +281 -291
- data/doc/bin_sequel.rdoc +5 -3
- data/doc/cheat_sheet.rdoc +86 -51
- data/doc/code_order.rdoc +25 -19
- data/doc/core_extensions.rdoc +104 -63
- data/doc/dataset_basics.rdoc +12 -21
- data/doc/dataset_filtering.rdoc +99 -86
- data/doc/extensions.rdoc +3 -10
- data/doc/fork_safety.rdoc +84 -0
- data/doc/mass_assignment.rdoc +74 -31
- data/doc/migration.rdoc +59 -51
- data/doc/model_dataset_method_design.rdoc +129 -0
- data/doc/model_hooks.rdoc +15 -25
- data/doc/model_plugins.rdoc +12 -12
- data/doc/mssql_stored_procedures.rdoc +3 -3
- data/doc/object_model.rdoc +58 -68
- data/doc/opening_databases.rdoc +85 -95
- data/doc/postgresql.rdoc +263 -38
- data/doc/prepared_statements.rdoc +29 -24
- data/doc/querying.rdoc +189 -167
- data/doc/reflection.rdoc +5 -6
- data/doc/release_notes/5.0.0.txt +159 -0
- data/doc/release_notes/5.1.0.txt +31 -0
- data/doc/release_notes/5.10.0.txt +84 -0
- data/doc/release_notes/5.11.0.txt +83 -0
- data/doc/release_notes/5.12.0.txt +141 -0
- data/doc/release_notes/5.13.0.txt +27 -0
- data/doc/release_notes/5.14.0.txt +63 -0
- data/doc/release_notes/5.15.0.txt +39 -0
- data/doc/release_notes/5.16.0.txt +110 -0
- data/doc/release_notes/5.17.0.txt +31 -0
- data/doc/release_notes/5.18.0.txt +69 -0
- data/doc/release_notes/5.19.0.txt +28 -0
- data/doc/release_notes/5.2.0.txt +33 -0
- data/doc/release_notes/5.20.0.txt +89 -0
- data/doc/release_notes/5.21.0.txt +87 -0
- data/doc/release_notes/5.22.0.txt +48 -0
- data/doc/release_notes/5.23.0.txt +56 -0
- data/doc/release_notes/5.24.0.txt +56 -0
- data/doc/release_notes/5.25.0.txt +32 -0
- data/doc/release_notes/5.26.0.txt +35 -0
- data/doc/release_notes/5.27.0.txt +21 -0
- data/doc/release_notes/5.28.0.txt +16 -0
- data/doc/release_notes/5.29.0.txt +22 -0
- data/doc/release_notes/5.3.0.txt +121 -0
- data/doc/release_notes/5.30.0.txt +20 -0
- data/doc/release_notes/5.31.0.txt +148 -0
- data/doc/release_notes/5.32.0.txt +46 -0
- data/doc/release_notes/5.33.0.txt +24 -0
- data/doc/release_notes/5.34.0.txt +40 -0
- data/doc/release_notes/5.35.0.txt +56 -0
- data/doc/release_notes/5.36.0.txt +60 -0
- data/doc/release_notes/5.37.0.txt +30 -0
- data/doc/release_notes/5.38.0.txt +28 -0
- data/doc/release_notes/5.39.0.txt +19 -0
- data/doc/release_notes/5.4.0.txt +80 -0
- data/doc/release_notes/5.40.0.txt +40 -0
- data/doc/release_notes/5.41.0.txt +25 -0
- data/doc/release_notes/5.42.0.txt +136 -0
- data/doc/release_notes/5.43.0.txt +98 -0
- data/doc/release_notes/5.44.0.txt +32 -0
- data/doc/release_notes/5.45.0.txt +34 -0
- 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.5.0.txt +61 -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.6.0.txt +31 -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.7.0.txt +108 -0
- data/doc/release_notes/5.8.0.txt +170 -0
- data/doc/release_notes/5.9.0.txt +99 -0
- data/doc/schema_modification.rdoc +95 -75
- data/doc/security.rdoc +109 -80
- data/doc/sharding.rdoc +74 -47
- data/doc/sql.rdoc +147 -122
- data/doc/testing.rdoc +43 -20
- data/doc/thread_safety.rdoc +2 -4
- data/doc/transactions.rdoc +97 -18
- data/doc/validations.rdoc +52 -50
- data/doc/virtual_rows.rdoc +90 -109
- data/lib/sequel/adapters/ado/access.rb +15 -17
- data/lib/sequel/adapters/ado/mssql.rb +6 -15
- data/lib/sequel/adapters/ado.rb +150 -20
- data/lib/sequel/adapters/amalgalite.rb +11 -23
- data/lib/sequel/adapters/ibmdb.rb +47 -55
- data/lib/sequel/adapters/jdbc/db2.rb +29 -39
- data/lib/sequel/adapters/jdbc/derby.rb +58 -54
- data/lib/sequel/adapters/jdbc/h2.rb +93 -35
- data/lib/sequel/adapters/jdbc/hsqldb.rb +24 -31
- data/lib/sequel/adapters/jdbc/jtds.rb +2 -10
- data/lib/sequel/adapters/jdbc/mssql.rb +3 -11
- data/lib/sequel/adapters/jdbc/mysql.rb +17 -20
- data/lib/sequel/adapters/jdbc/oracle.rb +22 -18
- data/lib/sequel/adapters/jdbc/postgresql.rb +69 -71
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +11 -23
- data/lib/sequel/adapters/jdbc/sqlite.rb +47 -11
- data/lib/sequel/adapters/jdbc/sqlserver.rb +34 -9
- data/lib/sequel/adapters/jdbc/transactions.rb +22 -38
- data/lib/sequel/adapters/jdbc.rb +145 -130
- data/lib/sequel/adapters/mock.rb +100 -111
- data/lib/sequel/adapters/mysql.rb +114 -122
- data/lib/sequel/adapters/mysql2.rb +147 -63
- data/lib/sequel/adapters/odbc/db2.rb +1 -1
- data/lib/sequel/adapters/odbc/mssql.rb +8 -14
- data/lib/sequel/adapters/odbc/oracle.rb +11 -0
- data/lib/sequel/adapters/odbc.rb +20 -25
- data/lib/sequel/adapters/oracle.rb +50 -56
- data/lib/sequel/adapters/postgres.rb +305 -327
- data/lib/sequel/adapters/postgresql.rb +1 -1
- data/lib/sequel/adapters/shared/access.rb +74 -78
- data/lib/sequel/adapters/shared/db2.rb +118 -71
- data/lib/sequel/adapters/shared/mssql.rb +301 -220
- data/lib/sequel/adapters/shared/mysql.rb +299 -217
- data/lib/sequel/adapters/shared/oracle.rb +226 -65
- data/lib/sequel/adapters/shared/postgres.rb +935 -395
- data/lib/sequel/adapters/shared/sqlanywhere.rb +105 -126
- data/lib/sequel/adapters/shared/sqlite.rb +447 -173
- data/lib/sequel/adapters/sqlanywhere.rb +48 -35
- data/lib/sequel/adapters/sqlite.rb +156 -111
- data/lib/sequel/adapters/tinytds.rb +30 -38
- data/lib/sequel/adapters/utils/columns_limit_1.rb +22 -0
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +3 -6
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +2 -2
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +87 -0
- data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +56 -0
- data/lib/sequel/adapters/utils/replace.rb +1 -4
- data/lib/sequel/adapters/utils/stored_procedures.rb +7 -22
- data/lib/sequel/adapters/utils/unmodified_identifiers.rb +28 -0
- data/lib/sequel/ast_transformer.rb +17 -89
- data/lib/sequel/connection_pool/sharded_single.rb +18 -15
- data/lib/sequel/connection_pool/sharded_threaded.rb +130 -111
- data/lib/sequel/connection_pool/single.rb +18 -13
- data/lib/sequel/connection_pool/threaded.rb +121 -120
- data/lib/sequel/connection_pool.rb +48 -29
- data/lib/sequel/core.rb +351 -301
- data/lib/sequel/database/connecting.rb +69 -57
- data/lib/sequel/database/dataset.rb +13 -5
- data/lib/sequel/database/dataset_defaults.rb +18 -102
- data/lib/sequel/database/features.rb +18 -4
- data/lib/sequel/database/logging.rb +12 -11
- data/lib/sequel/database/misc.rb +180 -122
- data/lib/sequel/database/query.rb +47 -27
- data/lib/sequel/database/schema_generator.rb +178 -84
- data/lib/sequel/database/schema_methods.rb +172 -97
- data/lib/sequel/database/transactions.rb +205 -44
- data/lib/sequel/database.rb +17 -2
- data/lib/sequel/dataset/actions.rb +339 -155
- data/lib/sequel/dataset/dataset_module.rb +46 -0
- data/lib/sequel/dataset/features.rb +90 -35
- data/lib/sequel/dataset/graph.rb +80 -58
- data/lib/sequel/dataset/misc.rb +137 -47
- data/lib/sequel/dataset/placeholder_literalizer.rb +63 -25
- data/lib/sequel/dataset/prepared_statements.rb +188 -85
- data/lib/sequel/dataset/query.rb +530 -222
- data/lib/sequel/dataset/sql.rb +590 -368
- data/lib/sequel/dataset.rb +26 -16
- data/lib/sequel/deprecated.rb +12 -2
- data/lib/sequel/exceptions.rb +46 -16
- data/lib/sequel/extensions/_model_constraint_validations.rb +16 -0
- data/lib/sequel/extensions/_model_pg_row.rb +43 -0
- data/lib/sequel/extensions/_pretty_table.rb +2 -5
- data/lib/sequel/extensions/any_not_empty.rb +45 -0
- data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
- data/lib/sequel/extensions/async_thread_pool.rb +438 -0
- data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
- data/lib/sequel/extensions/blank.rb +8 -0
- data/lib/sequel/extensions/caller_logging.rb +79 -0
- data/lib/sequel/extensions/columns_introspection.rb +4 -3
- data/lib/sequel/extensions/connection_expiration.rb +20 -10
- data/lib/sequel/extensions/connection_validator.rb +11 -10
- data/lib/sequel/extensions/constant_sql_override.rb +65 -0
- data/lib/sequel/extensions/constraint_validations.rb +62 -39
- data/lib/sequel/extensions/core_extensions.rb +42 -48
- data/lib/sequel/extensions/core_refinements.rb +80 -59
- data/lib/sequel/extensions/current_datetime_timestamp.rb +1 -4
- data/lib/sequel/extensions/date_arithmetic.rb +98 -39
- data/lib/sequel/extensions/date_parse_input_handler.rb +67 -0
- data/lib/sequel/extensions/datetime_parse_to_time.rb +41 -0
- data/lib/sequel/extensions/duplicate_columns_handler.rb +21 -14
- data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
- data/lib/sequel/extensions/escaped_like.rb +100 -0
- data/lib/sequel/extensions/eval_inspect.rb +12 -15
- data/lib/sequel/extensions/exclude_or_null.rb +68 -0
- data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
- data/lib/sequel/extensions/freeze_datasets.rb +3 -0
- data/lib/sequel/extensions/from_block.rb +1 -34
- data/lib/sequel/extensions/graph_each.rb +4 -4
- data/lib/sequel/extensions/identifier_mangling.rb +180 -0
- data/lib/sequel/extensions/implicit_subquery.rb +48 -0
- data/lib/sequel/extensions/index_caching.rb +109 -0
- data/lib/sequel/extensions/inflector.rb +13 -5
- data/lib/sequel/extensions/integer64.rb +32 -0
- data/lib/sequel/extensions/is_distinct_from.rb +141 -0
- data/lib/sequel/extensions/looser_typecasting.rb +17 -8
- data/lib/sequel/extensions/migration.rb +119 -78
- data/lib/sequel/extensions/named_timezones.rb +88 -23
- data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -82
- data/lib/sequel/extensions/null_dataset.rb +8 -8
- data/lib/sequel/extensions/pagination.rb +32 -29
- data/lib/sequel/extensions/pg_array.rb +221 -287
- data/lib/sequel/extensions/pg_array_ops.rb +17 -9
- data/lib/sequel/extensions/pg_enum.rb +63 -23
- data/lib/sequel/extensions/pg_extended_date_support.rb +241 -0
- data/lib/sequel/extensions/pg_hstore.rb +45 -54
- data/lib/sequel/extensions/pg_hstore_ops.rb +58 -6
- data/lib/sequel/extensions/pg_inet.rb +31 -12
- data/lib/sequel/extensions/pg_inet_ops.rb +2 -2
- data/lib/sequel/extensions/pg_interval.rb +56 -29
- data/lib/sequel/extensions/pg_json.rb +417 -140
- data/lib/sequel/extensions/pg_json_ops.rb +270 -18
- data/lib/sequel/extensions/pg_loose_count.rb +4 -2
- data/lib/sequel/extensions/pg_multirange.rb +372 -0
- data/lib/sequel/extensions/pg_range.rb +131 -191
- data/lib/sequel/extensions/pg_range_ops.rb +42 -13
- data/lib/sequel/extensions/pg_row.rb +48 -81
- data/lib/sequel/extensions/pg_row_ops.rb +33 -14
- data/lib/sequel/extensions/pg_static_cache_updater.rb +2 -2
- data/lib/sequel/extensions/pg_timestamptz.rb +28 -0
- data/lib/sequel/extensions/query.rb +9 -7
- data/lib/sequel/extensions/round_timestamps.rb +0 -6
- data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
- data/lib/sequel/extensions/s.rb +60 -0
- data/lib/sequel/extensions/schema_caching.rb +10 -1
- data/lib/sequel/extensions/schema_dumper.rb +71 -48
- data/lib/sequel/extensions/select_remove.rb +4 -4
- data/lib/sequel/extensions/sequel_4_dataset_methods.rb +85 -0
- data/lib/sequel/extensions/server_block.rb +51 -27
- data/lib/sequel/extensions/split_array_nil.rb +4 -4
- data/lib/sequel/extensions/sql_comments.rb +119 -7
- data/lib/sequel/extensions/sql_expr.rb +2 -1
- 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 +11 -8
- data/lib/sequel/extensions/string_date_time.rb +19 -23
- data/lib/sequel/extensions/symbol_aref.rb +55 -0
- data/lib/sequel/extensions/symbol_aref_refinement.rb +43 -0
- data/lib/sequel/extensions/symbol_as.rb +23 -0
- data/lib/sequel/extensions/symbol_as_refinement.rb +37 -0
- data/lib/sequel/extensions/synchronize_sql.rb +45 -0
- data/lib/sequel/extensions/to_dot.rb +10 -4
- data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
- data/lib/sequel/model/associations.rb +1006 -284
- data/lib/sequel/model/base.rb +560 -805
- data/lib/sequel/model/dataset_module.rb +11 -10
- data/lib/sequel/model/default_inflections.rb +1 -1
- data/lib/sequel/model/errors.rb +10 -3
- data/lib/sequel/model/exceptions.rb +8 -10
- data/lib/sequel/model/inflections.rb +7 -20
- data/lib/sequel/model/plugins.rb +114 -0
- data/lib/sequel/model.rb +32 -82
- data/lib/sequel/plugins/active_model.rb +30 -14
- data/lib/sequel/plugins/after_initialize.rb +1 -1
- data/lib/sequel/plugins/association_dependencies.rb +25 -18
- data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
- data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
- data/lib/sequel/plugins/association_pks.rb +147 -70
- data/lib/sequel/plugins/association_proxies.rb +33 -9
- data/lib/sequel/plugins/async_thread_pool.rb +39 -0
- data/lib/sequel/plugins/auto_restrict_eager_graph.rb +62 -0
- data/lib/sequel/plugins/auto_validations.rb +95 -28
- data/lib/sequel/plugins/auto_validations_constraint_validations_presence_message.rb +68 -0
- data/lib/sequel/plugins/before_after_save.rb +0 -42
- data/lib/sequel/plugins/blacklist_security.rb +21 -12
- data/lib/sequel/plugins/boolean_readers.rb +5 -5
- data/lib/sequel/plugins/boolean_subsets.rb +13 -8
- data/lib/sequel/plugins/caching.rb +25 -16
- data/lib/sequel/plugins/class_table_inheritance.rb +179 -100
- data/lib/sequel/plugins/column_conflicts.rb +16 -3
- data/lib/sequel/plugins/column_encryption.rb +728 -0
- data/lib/sequel/plugins/column_select.rb +7 -5
- data/lib/sequel/plugins/columns_updated.rb +42 -0
- data/lib/sequel/plugins/composition.rb +42 -26
- data/lib/sequel/plugins/concurrent_eager_loading.rb +174 -0
- data/lib/sequel/plugins/constraint_validations.rb +20 -14
- data/lib/sequel/plugins/csv_serializer.rb +56 -35
- data/lib/sequel/plugins/dataset_associations.rb +40 -17
- data/lib/sequel/plugins/def_dataset_method.rb +90 -0
- data/lib/sequel/plugins/defaults_setter.rb +65 -10
- data/lib/sequel/plugins/delay_add_association.rb +1 -1
- data/lib/sequel/plugins/dirty.rb +62 -24
- data/lib/sequel/plugins/eager_each.rb +3 -3
- data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
- data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
- data/lib/sequel/plugins/enum.rb +124 -0
- data/lib/sequel/plugins/error_splitter.rb +17 -12
- data/lib/sequel/plugins/finder.rb +246 -0
- data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
- data/lib/sequel/plugins/force_encoding.rb +7 -12
- data/lib/sequel/plugins/hook_class_methods.rb +37 -54
- data/lib/sequel/plugins/input_transformer.rb +18 -10
- data/lib/sequel/plugins/insert_conflict.rb +76 -0
- data/lib/sequel/plugins/insert_returning_select.rb +2 -2
- data/lib/sequel/plugins/instance_filters.rb +10 -8
- data/lib/sequel/plugins/instance_hooks.rb +34 -17
- data/lib/sequel/plugins/instance_specific_default.rb +113 -0
- data/lib/sequel/plugins/inverted_subsets.rb +22 -13
- data/lib/sequel/plugins/json_serializer.rb +124 -64
- data/lib/sequel/plugins/lazy_attributes.rb +21 -14
- data/lib/sequel/plugins/list.rb +35 -21
- data/lib/sequel/plugins/many_through_many.rb +134 -21
- data/lib/sequel/plugins/modification_detection.rb +15 -5
- data/lib/sequel/plugins/mssql_optimistic_locking.rb +6 -5
- data/lib/sequel/plugins/nested_attributes.rb +61 -31
- data/lib/sequel/plugins/optimistic_locking.rb +3 -3
- data/lib/sequel/plugins/pg_array_associations.rb +103 -53
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +350 -0
- data/lib/sequel/plugins/pg_row.rb +5 -51
- data/lib/sequel/plugins/prepared_statements.rb +60 -72
- data/lib/sequel/plugins/prepared_statements_safe.rb +9 -4
- data/lib/sequel/plugins/rcte_tree.rb +68 -82
- data/lib/sequel/plugins/require_valid_schema.rb +67 -0
- data/lib/sequel/plugins/serialization.rb +43 -46
- data/lib/sequel/plugins/serialization_modification_detection.rb +3 -2
- data/lib/sequel/plugins/sharding.rb +15 -10
- data/lib/sequel/plugins/single_table_inheritance.rb +67 -28
- data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
- data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
- data/lib/sequel/plugins/split_values.rb +11 -6
- data/lib/sequel/plugins/sql_comments.rb +189 -0
- data/lib/sequel/plugins/static_cache.rb +77 -53
- data/lib/sequel/plugins/static_cache_cache.rb +53 -0
- data/lib/sequel/plugins/string_stripper.rb +3 -3
- data/lib/sequel/plugins/subclasses.rb +43 -10
- data/lib/sequel/plugins/subset_conditions.rb +15 -5
- data/lib/sequel/plugins/table_select.rb +2 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +96 -12
- data/lib/sequel/plugins/throw_failures.rb +110 -0
- data/lib/sequel/plugins/timestamps.rb +20 -8
- data/lib/sequel/plugins/touch.rb +19 -8
- data/lib/sequel/plugins/tree.rb +62 -32
- data/lib/sequel/plugins/typecast_on_load.rb +12 -4
- data/lib/sequel/plugins/unlimited_update.rb +1 -7
- data/lib/sequel/plugins/unused_associations.rb +521 -0
- data/lib/sequel/plugins/update_or_create.rb +4 -4
- data/lib/sequel/plugins/update_primary_key.rb +1 -1
- data/lib/sequel/plugins/update_refresh.rb +26 -15
- data/lib/sequel/plugins/uuid.rb +7 -11
- data/lib/sequel/plugins/validate_associated.rb +18 -0
- data/lib/sequel/plugins/validation_class_methods.rb +38 -19
- data/lib/sequel/plugins/validation_contexts.rb +49 -0
- data/lib/sequel/plugins/validation_helpers.rb +57 -41
- data/lib/sequel/plugins/whitelist_security.rb +122 -0
- data/lib/sequel/plugins/xml_serializer.rb +30 -31
- data/lib/sequel/sql.rb +471 -331
- data/lib/sequel/timezones.rb +78 -47
- data/lib/sequel/version.rb +7 -2
- data/lib/sequel.rb +1 -1
- metadata +217 -521
- data/Rakefile +0 -164
- data/doc/active_record.rdoc +0 -928
- data/doc/release_notes/1.0.txt +0 -38
- data/doc/release_notes/1.1.txt +0 -143
- data/doc/release_notes/1.3.txt +0 -101
- data/doc/release_notes/1.4.0.txt +0 -53
- data/doc/release_notes/1.5.0.txt +0 -155
- data/doc/release_notes/2.0.0.txt +0 -298
- data/doc/release_notes/2.1.0.txt +0 -271
- data/doc/release_notes/2.10.0.txt +0 -328
- data/doc/release_notes/2.11.0.txt +0 -215
- data/doc/release_notes/2.12.0.txt +0 -534
- data/doc/release_notes/2.2.0.txt +0 -253
- data/doc/release_notes/2.3.0.txt +0 -88
- data/doc/release_notes/2.4.0.txt +0 -106
- data/doc/release_notes/2.5.0.txt +0 -137
- data/doc/release_notes/2.6.0.txt +0 -157
- data/doc/release_notes/2.7.0.txt +0 -166
- data/doc/release_notes/2.8.0.txt +0 -171
- data/doc/release_notes/2.9.0.txt +0 -97
- data/doc/release_notes/3.0.0.txt +0 -221
- data/doc/release_notes/3.1.0.txt +0 -406
- data/doc/release_notes/3.10.0.txt +0 -286
- data/doc/release_notes/3.11.0.txt +0 -254
- data/doc/release_notes/3.12.0.txt +0 -304
- data/doc/release_notes/3.13.0.txt +0 -210
- data/doc/release_notes/3.14.0.txt +0 -118
- data/doc/release_notes/3.15.0.txt +0 -78
- data/doc/release_notes/3.16.0.txt +0 -45
- data/doc/release_notes/3.17.0.txt +0 -58
- data/doc/release_notes/3.18.0.txt +0 -120
- data/doc/release_notes/3.19.0.txt +0 -67
- data/doc/release_notes/3.2.0.txt +0 -268
- data/doc/release_notes/3.20.0.txt +0 -41
- data/doc/release_notes/3.21.0.txt +0 -87
- data/doc/release_notes/3.22.0.txt +0 -39
- data/doc/release_notes/3.23.0.txt +0 -172
- data/doc/release_notes/3.24.0.txt +0 -420
- data/doc/release_notes/3.25.0.txt +0 -88
- data/doc/release_notes/3.26.0.txt +0 -88
- data/doc/release_notes/3.27.0.txt +0 -82
- data/doc/release_notes/3.28.0.txt +0 -304
- data/doc/release_notes/3.29.0.txt +0 -459
- data/doc/release_notes/3.3.0.txt +0 -192
- data/doc/release_notes/3.30.0.txt +0 -135
- data/doc/release_notes/3.31.0.txt +0 -146
- data/doc/release_notes/3.32.0.txt +0 -202
- data/doc/release_notes/3.33.0.txt +0 -157
- data/doc/release_notes/3.34.0.txt +0 -671
- data/doc/release_notes/3.35.0.txt +0 -144
- data/doc/release_notes/3.36.0.txt +0 -245
- data/doc/release_notes/3.37.0.txt +0 -338
- data/doc/release_notes/3.38.0.txt +0 -234
- data/doc/release_notes/3.39.0.txt +0 -237
- data/doc/release_notes/3.4.0.txt +0 -325
- data/doc/release_notes/3.40.0.txt +0 -73
- data/doc/release_notes/3.41.0.txt +0 -155
- data/doc/release_notes/3.42.0.txt +0 -74
- data/doc/release_notes/3.43.0.txt +0 -105
- data/doc/release_notes/3.44.0.txt +0 -152
- data/doc/release_notes/3.45.0.txt +0 -179
- data/doc/release_notes/3.46.0.txt +0 -122
- data/doc/release_notes/3.47.0.txt +0 -270
- data/doc/release_notes/3.48.0.txt +0 -477
- data/doc/release_notes/3.5.0.txt +0 -510
- data/doc/release_notes/3.6.0.txt +0 -366
- data/doc/release_notes/3.7.0.txt +0 -179
- data/doc/release_notes/3.8.0.txt +0 -151
- data/doc/release_notes/3.9.0.txt +0 -233
- data/doc/release_notes/4.0.0.txt +0 -262
- data/doc/release_notes/4.1.0.txt +0 -85
- data/doc/release_notes/4.10.0.txt +0 -226
- data/doc/release_notes/4.11.0.txt +0 -147
- data/doc/release_notes/4.12.0.txt +0 -105
- data/doc/release_notes/4.13.0.txt +0 -169
- data/doc/release_notes/4.14.0.txt +0 -68
- data/doc/release_notes/4.15.0.txt +0 -56
- data/doc/release_notes/4.16.0.txt +0 -36
- data/doc/release_notes/4.17.0.txt +0 -38
- data/doc/release_notes/4.18.0.txt +0 -36
- data/doc/release_notes/4.19.0.txt +0 -45
- data/doc/release_notes/4.2.0.txt +0 -129
- data/doc/release_notes/4.20.0.txt +0 -79
- data/doc/release_notes/4.21.0.txt +0 -94
- data/doc/release_notes/4.22.0.txt +0 -72
- data/doc/release_notes/4.23.0.txt +0 -65
- data/doc/release_notes/4.24.0.txt +0 -99
- data/doc/release_notes/4.25.0.txt +0 -181
- data/doc/release_notes/4.26.0.txt +0 -44
- data/doc/release_notes/4.27.0.txt +0 -78
- data/doc/release_notes/4.28.0.txt +0 -57
- data/doc/release_notes/4.29.0.txt +0 -41
- data/doc/release_notes/4.3.0.txt +0 -40
- data/doc/release_notes/4.30.0.txt +0 -37
- data/doc/release_notes/4.31.0.txt +0 -57
- data/doc/release_notes/4.32.0.txt +0 -132
- data/doc/release_notes/4.33.0.txt +0 -88
- data/doc/release_notes/4.34.0.txt +0 -86
- data/doc/release_notes/4.35.0.txt +0 -130
- data/doc/release_notes/4.36.0.txt +0 -116
- data/doc/release_notes/4.4.0.txt +0 -92
- data/doc/release_notes/4.5.0.txt +0 -34
- data/doc/release_notes/4.6.0.txt +0 -30
- data/doc/release_notes/4.7.0.txt +0 -103
- data/doc/release_notes/4.8.0.txt +0 -175
- data/doc/release_notes/4.9.0.txt +0 -190
- data/lib/sequel/adapters/cubrid.rb +0 -144
- data/lib/sequel/adapters/do/mysql.rb +0 -66
- data/lib/sequel/adapters/do/postgres.rb +0 -44
- data/lib/sequel/adapters/do/sqlite3.rb +0 -42
- data/lib/sequel/adapters/do.rb +0 -158
- data/lib/sequel/adapters/jdbc/as400.rb +0 -84
- data/lib/sequel/adapters/jdbc/cubrid.rb +0 -64
- data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -36
- data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -33
- data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -33
- data/lib/sequel/adapters/odbc/progress.rb +0 -10
- data/lib/sequel/adapters/shared/cubrid.rb +0 -245
- data/lib/sequel/adapters/shared/firebird.rb +0 -247
- data/lib/sequel/adapters/shared/informix.rb +0 -54
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +0 -152
- data/lib/sequel/adapters/shared/progress.rb +0 -40
- data/lib/sequel/adapters/swift/mysql.rb +0 -49
- data/lib/sequel/adapters/swift/postgres.rb +0 -47
- data/lib/sequel/adapters/swift/sqlite.rb +0 -49
- data/lib/sequel/adapters/swift.rb +0 -160
- data/lib/sequel/adapters/utils/pg_types.rb +0 -70
- data/lib/sequel/dataset/mutation.rb +0 -111
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -5
- data/lib/sequel/extensions/filter_having.rb +0 -63
- data/lib/sequel/extensions/hash_aliases.rb +0 -49
- data/lib/sequel/extensions/meta_def.rb +0 -35
- data/lib/sequel/extensions/query_literals.rb +0 -84
- data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -24
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -122
- data/lib/sequel/extensions/set_overrides.rb +0 -76
- data/lib/sequel/no_core_ext.rb +0 -3
- data/lib/sequel/plugins/association_autoreloading.rb +0 -9
- data/lib/sequel/plugins/identifier_columns.rb +0 -47
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -9
- data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -81
- data/lib/sequel/plugins/prepared_statements_associations.rb +0 -119
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -61
- data/lib/sequel/plugins/schema.rb +0 -82
- data/lib/sequel/plugins/scissors.rb +0 -35
- data/spec/adapter_spec.rb +0 -4
- data/spec/adapters/db2_spec.rb +0 -160
- data/spec/adapters/firebird_spec.rb +0 -411
- data/spec/adapters/informix_spec.rb +0 -100
- data/spec/adapters/mssql_spec.rb +0 -733
- data/spec/adapters/mysql_spec.rb +0 -1319
- data/spec/adapters/oracle_spec.rb +0 -313
- data/spec/adapters/postgres_spec.rb +0 -3790
- data/spec/adapters/spec_helper.rb +0 -49
- data/spec/adapters/sqlanywhere_spec.rb +0 -170
- data/spec/adapters/sqlite_spec.rb +0 -688
- data/spec/bin_spec.rb +0 -258
- data/spec/core/connection_pool_spec.rb +0 -1045
- data/spec/core/database_spec.rb +0 -2636
- data/spec/core/dataset_spec.rb +0 -5175
- data/spec/core/deprecated_spec.rb +0 -70
- data/spec/core/expression_filters_spec.rb +0 -1247
- data/spec/core/mock_adapter_spec.rb +0 -464
- data/spec/core/object_graph_spec.rb +0 -303
- data/spec/core/placeholder_literalizer_spec.rb +0 -163
- data/spec/core/schema_generator_spec.rb +0 -203
- data/spec/core/schema_spec.rb +0 -1676
- data/spec/core/spec_helper.rb +0 -34
- data/spec/core/version_spec.rb +0 -7
- data/spec/core_extensions_spec.rb +0 -699
- data/spec/core_model_spec.rb +0 -2
- data/spec/core_spec.rb +0 -1
- data/spec/extensions/accessed_columns_spec.rb +0 -51
- data/spec/extensions/active_model_spec.rb +0 -85
- data/spec/extensions/after_initialize_spec.rb +0 -24
- data/spec/extensions/arbitrary_servers_spec.rb +0 -109
- data/spec/extensions/association_dependencies_spec.rb +0 -117
- data/spec/extensions/association_pks_spec.rb +0 -405
- data/spec/extensions/association_proxies_spec.rb +0 -86
- data/spec/extensions/auto_validations_spec.rb +0 -192
- data/spec/extensions/before_after_save_spec.rb +0 -40
- data/spec/extensions/blacklist_security_spec.rb +0 -88
- data/spec/extensions/blank_spec.rb +0 -69
- data/spec/extensions/boolean_readers_spec.rb +0 -93
- data/spec/extensions/boolean_subsets_spec.rb +0 -47
- data/spec/extensions/caching_spec.rb +0 -270
- data/spec/extensions/class_table_inheritance_spec.rb +0 -444
- data/spec/extensions/column_conflicts_spec.rb +0 -60
- data/spec/extensions/column_select_spec.rb +0 -108
- data/spec/extensions/columns_introspection_spec.rb +0 -91
- data/spec/extensions/composition_spec.rb +0 -242
- data/spec/extensions/connection_expiration_spec.rb +0 -121
- data/spec/extensions/connection_validator_spec.rb +0 -127
- data/spec/extensions/constraint_validations_plugin_spec.rb +0 -288
- data/spec/extensions/constraint_validations_spec.rb +0 -389
- data/spec/extensions/core_refinements_spec.rb +0 -519
- data/spec/extensions/csv_serializer_spec.rb +0 -180
- data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
- data/spec/extensions/dataset_associations_spec.rb +0 -343
- data/spec/extensions/dataset_source_alias_spec.rb +0 -51
- data/spec/extensions/date_arithmetic_spec.rb +0 -167
- data/spec/extensions/defaults_setter_spec.rb +0 -102
- data/spec/extensions/delay_add_association_spec.rb +0 -74
- data/spec/extensions/dirty_spec.rb +0 -180
- data/spec/extensions/duplicate_columns_handler_spec.rb +0 -110
- data/spec/extensions/eager_each_spec.rb +0 -66
- data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
- data/spec/extensions/error_splitter_spec.rb +0 -18
- data/spec/extensions/error_sql_spec.rb +0 -20
- data/spec/extensions/eval_inspect_spec.rb +0 -73
- data/spec/extensions/filter_having_spec.rb +0 -40
- data/spec/extensions/force_encoding_spec.rb +0 -114
- data/spec/extensions/from_block_spec.rb +0 -21
- data/spec/extensions/graph_each_spec.rb +0 -119
- data/spec/extensions/hash_aliases_spec.rb +0 -24
- data/spec/extensions/hook_class_methods_spec.rb +0 -429
- data/spec/extensions/identifier_columns_spec.rb +0 -17
- data/spec/extensions/inflector_spec.rb +0 -183
- data/spec/extensions/input_transformer_spec.rb +0 -54
- data/spec/extensions/insert_returning_select_spec.rb +0 -46
- data/spec/extensions/instance_filters_spec.rb +0 -79
- data/spec/extensions/instance_hooks_spec.rb +0 -276
- data/spec/extensions/inverted_subsets_spec.rb +0 -33
- data/spec/extensions/json_serializer_spec.rb +0 -304
- data/spec/extensions/lazy_attributes_spec.rb +0 -170
- data/spec/extensions/list_spec.rb +0 -278
- data/spec/extensions/looser_typecasting_spec.rb +0 -43
- data/spec/extensions/many_through_many_spec.rb +0 -2172
- data/spec/extensions/meta_def_spec.rb +0 -21
- data/spec/extensions/migration_spec.rb +0 -728
- data/spec/extensions/modification_detection_spec.rb +0 -80
- data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -91
- data/spec/extensions/named_timezones_spec.rb +0 -108
- data/spec/extensions/nested_attributes_spec.rb +0 -697
- data/spec/extensions/no_auto_literal_strings_spec.rb +0 -65
- data/spec/extensions/null_dataset_spec.rb +0 -85
- data/spec/extensions/optimistic_locking_spec.rb +0 -128
- data/spec/extensions/pagination_spec.rb +0 -118
- data/spec/extensions/pg_array_associations_spec.rb +0 -736
- data/spec/extensions/pg_array_ops_spec.rb +0 -143
- data/spec/extensions/pg_array_spec.rb +0 -390
- data/spec/extensions/pg_enum_spec.rb +0 -92
- data/spec/extensions/pg_hstore_ops_spec.rb +0 -236
- data/spec/extensions/pg_hstore_spec.rb +0 -206
- data/spec/extensions/pg_inet_ops_spec.rb +0 -101
- data/spec/extensions/pg_inet_spec.rb +0 -52
- data/spec/extensions/pg_interval_spec.rb +0 -76
- data/spec/extensions/pg_json_ops_spec.rb +0 -275
- data/spec/extensions/pg_json_spec.rb +0 -218
- data/spec/extensions/pg_loose_count_spec.rb +0 -17
- data/spec/extensions/pg_range_ops_spec.rb +0 -58
- data/spec/extensions/pg_range_spec.rb +0 -473
- data/spec/extensions/pg_row_ops_spec.rb +0 -60
- data/spec/extensions/pg_row_plugin_spec.rb +0 -62
- data/spec/extensions/pg_row_spec.rb +0 -360
- data/spec/extensions/pg_static_cache_updater_spec.rb +0 -92
- data/spec/extensions/pg_typecast_on_load_spec.rb +0 -63
- data/spec/extensions/prepared_statements_associations_spec.rb +0 -159
- data/spec/extensions/prepared_statements_safe_spec.rb +0 -61
- data/spec/extensions/prepared_statements_spec.rb +0 -103
- data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -31
- data/spec/extensions/pretty_table_spec.rb +0 -92
- data/spec/extensions/query_literals_spec.rb +0 -183
- data/spec/extensions/query_spec.rb +0 -102
- data/spec/extensions/rcte_tree_spec.rb +0 -392
- data/spec/extensions/round_timestamps_spec.rb +0 -43
- data/spec/extensions/schema_caching_spec.rb +0 -41
- data/spec/extensions/schema_dumper_spec.rb +0 -814
- data/spec/extensions/schema_spec.rb +0 -117
- data/spec/extensions/scissors_spec.rb +0 -26
- data/spec/extensions/select_remove_spec.rb +0 -38
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -101
- data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
- data/spec/extensions/serialization_spec.rb +0 -362
- data/spec/extensions/server_block_spec.rb +0 -90
- data/spec/extensions/server_logging_spec.rb +0 -45
- data/spec/extensions/set_overrides_spec.rb +0 -61
- data/spec/extensions/sharding_spec.rb +0 -198
- data/spec/extensions/shared_caching_spec.rb +0 -175
- data/spec/extensions/single_table_inheritance_spec.rb +0 -297
- data/spec/extensions/singular_table_names_spec.rb +0 -22
- data/spec/extensions/skip_create_refresh_spec.rb +0 -17
- data/spec/extensions/spec_helper.rb +0 -71
- data/spec/extensions/split_array_nil_spec.rb +0 -24
- data/spec/extensions/split_values_spec.rb +0 -22
- data/spec/extensions/sql_comments_spec.rb +0 -27
- data/spec/extensions/sql_expr_spec.rb +0 -60
- data/spec/extensions/static_cache_spec.rb +0 -361
- data/spec/extensions/string_agg_spec.rb +0 -85
- data/spec/extensions/string_date_time_spec.rb +0 -95
- data/spec/extensions/string_stripper_spec.rb +0 -68
- data/spec/extensions/subclasses_spec.rb +0 -66
- data/spec/extensions/subset_conditions_spec.rb +0 -38
- data/spec/extensions/table_select_spec.rb +0 -71
- data/spec/extensions/tactical_eager_loading_spec.rb +0 -136
- data/spec/extensions/thread_local_timezones_spec.rb +0 -67
- data/spec/extensions/timestamps_spec.rb +0 -175
- data/spec/extensions/to_dot_spec.rb +0 -154
- data/spec/extensions/touch_spec.rb +0 -203
- data/spec/extensions/tree_spec.rb +0 -274
- data/spec/extensions/typecast_on_load_spec.rb +0 -80
- data/spec/extensions/unlimited_update_spec.rb +0 -20
- data/spec/extensions/update_or_create_spec.rb +0 -87
- data/spec/extensions/update_primary_key_spec.rb +0 -100
- data/spec/extensions/update_refresh_spec.rb +0 -53
- data/spec/extensions/uuid_spec.rb +0 -106
- data/spec/extensions/validate_associated_spec.rb +0 -52
- data/spec/extensions/validation_class_methods_spec.rb +0 -1027
- data/spec/extensions/validation_helpers_spec.rb +0 -554
- data/spec/extensions/xml_serializer_spec.rb +0 -207
- data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
- data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
- data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
- data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
- data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/double_migration/001_create_sessions.rb +0 -9
- data/spec/files/double_migration/002_create_nodes.rb +0 -19
- data/spec/files/double_migration/003_3_create_users.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
- data/spec/files/empty_migration/001_create_sessions.rb +0 -9
- data/spec/files/empty_migration/002_create_nodes.rb +0 -0
- data/spec/files/empty_migration/003_3_create_users.rb +0 -4
- data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
- data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
- data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
- data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
- data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/reversible_migrations/001_reversible.rb +0 -5
- data/spec/files/reversible_migrations/002_reversible.rb +0 -5
- data/spec/files/reversible_migrations/003_reversible.rb +0 -5
- data/spec/files/reversible_migrations/004_reversible.rb +0 -5
- data/spec/files/reversible_migrations/005_reversible.rb +0 -10
- data/spec/files/reversible_migrations/006_reversible.rb +0 -10
- data/spec/files/reversible_migrations/007_reversible.rb +0 -10
- data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
- data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
- data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
- data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
- data/spec/guards_helper.rb +0 -55
- data/spec/integration/associations_test.rb +0 -2506
- data/spec/integration/database_test.rb +0 -113
- data/spec/integration/dataset_test.rb +0 -1858
- data/spec/integration/eager_loader_test.rb +0 -687
- data/spec/integration/migrator_test.rb +0 -262
- data/spec/integration/model_test.rb +0 -230
- data/spec/integration/plugin_test.rb +0 -2297
- data/spec/integration/prepared_statement_test.rb +0 -467
- data/spec/integration/schema_test.rb +0 -815
- data/spec/integration/spec_helper.rb +0 -56
- data/spec/integration/timezone_test.rb +0 -86
- data/spec/integration/transaction_test.rb +0 -406
- data/spec/integration/type_test.rb +0 -133
- data/spec/model/association_reflection_spec.rb +0 -565
- data/spec/model/associations_spec.rb +0 -4589
- data/spec/model/base_spec.rb +0 -759
- data/spec/model/class_dataset_methods_spec.rb +0 -150
- data/spec/model/dataset_methods_spec.rb +0 -149
- data/spec/model/eager_loading_spec.rb +0 -2197
- data/spec/model/hooks_spec.rb +0 -604
- data/spec/model/inflector_spec.rb +0 -26
- data/spec/model/model_spec.rb +0 -1097
- data/spec/model/plugins_spec.rb +0 -299
- data/spec/model/record_spec.rb +0 -2162
- data/spec/model/spec_helper.rb +0 -46
- data/spec/model/validations_spec.rb +0 -193
- data/spec/model_no_assoc_spec.rb +0 -1
- data/spec/model_spec.rb +0 -1
- data/spec/plugin_spec.rb +0 -1
- data/spec/sequel_coverage.rb +0 -15
- data/spec/spec_config.rb +0 -10
data/README.rdoc
CHANGED
@@ -8,24 +8,24 @@ toolkit for Ruby.
|
|
8
8
|
* Sequel includes a comprehensive ORM layer for mapping
|
9
9
|
records to Ruby objects and handling associated records.
|
10
10
|
* Sequel supports advanced database features such as prepared
|
11
|
-
statements, bound variables,
|
12
|
-
|
13
|
-
|
14
|
-
* Sequel currently has adapters for ADO, Amalgalite,
|
15
|
-
|
16
|
-
PostgreSQL, SQLAnywhere, SQLite3,
|
11
|
+
statements, bound variables, savepoints, two-phase commit,
|
12
|
+
transaction isolation, primary/replica configurations, and
|
13
|
+
database sharding.
|
14
|
+
* Sequel currently has adapters for ADO, Amalgalite,
|
15
|
+
IBM_DB, JDBC, MySQL, Mysql2, ODBC, Oracle,
|
16
|
+
PostgreSQL, SQLAnywhere, SQLite3, and TinyTDS.
|
17
17
|
|
18
18
|
== Resources
|
19
19
|
|
20
|
-
Website ::
|
21
|
-
RDoc Documentation ::
|
20
|
+
Website :: https://sequel.jeremyevans.net
|
21
|
+
RDoc Documentation :: https://sequel.jeremyevans.net/rdoc
|
22
22
|
Source Code :: https://github.com/jeremyevans/sequel
|
23
|
-
Bug tracking (GitHub Issues) ::
|
24
|
-
Discussion Forum (
|
25
|
-
|
23
|
+
Bug tracking (GitHub Issues) :: https://github.com/jeremyevans/sequel/issues
|
24
|
+
Discussion Forum (GitHub Discussions) :: https://github.com/jeremyevans/sequel/discussions
|
25
|
+
Alternate Discussion Forum (sequel-talk Google Group) :: http://groups.google.com/group/sequel-talk
|
26
26
|
|
27
27
|
If you have questions about how to use Sequel, please ask on the
|
28
|
-
sequel-talk Google Group
|
28
|
+
sequel-talk Google Group. Only use the the bug tracker to report
|
29
29
|
bugs in Sequel, not to ask for help on using Sequel.
|
30
30
|
|
31
31
|
To check out the source code:
|
@@ -71,7 +71,7 @@ Sequel includes an IRB console for quick access to databases (usually referred t
|
|
71
71
|
|
72
72
|
sequel sqlite://test.db # test.db in current directory
|
73
73
|
|
74
|
-
You get an IRB session with the
|
74
|
+
You get an IRB session with the Sequel::Database object stored in DB.
|
75
75
|
|
76
76
|
In addition to providing an IRB shell (the default behavior), bin/sequel also has support for migrating databases, dumping schema migrations, and copying databases. See the {bin/sequel guide}[rdoc-ref:doc/bin_sequel.rdoc] for more details.
|
77
77
|
|
@@ -83,24 +83,25 @@ Sequel uses the concept of datasets to retrieve data. A Dataset object encapsula
|
|
83
83
|
|
84
84
|
For example, the following one-liner returns the average GDP for countries in the middle east region:
|
85
85
|
|
86
|
-
DB[:countries].
|
86
|
+
DB[:countries].where(:region => 'Middle East').avg(:GDP)
|
87
87
|
|
88
88
|
Which is equivalent to:
|
89
89
|
|
90
90
|
SELECT avg(GDP) FROM countries WHERE region = 'Middle East'
|
91
91
|
|
92
|
-
Since datasets retrieve records only when needed, they can be stored and later reused. Records are fetched as hashes
|
92
|
+
Since datasets retrieve records only when needed, they can be stored and later reused. Records are fetched as hashes, and are accessed using an +Enumerable+ interface:
|
93
93
|
|
94
|
-
middle_east = DB[:countries].
|
94
|
+
middle_east = DB[:countries].where(:region => 'Middle East')
|
95
95
|
middle_east.order(:name).each{|r| puts r[:name]}
|
96
96
|
|
97
97
|
Sequel also offers convenience methods for extracting data from Datasets, such as an extended +map+ method:
|
98
98
|
|
99
|
-
middle_east.map(:name)
|
99
|
+
middle_east.map(:name) # => ['Egypt', 'Turkey', 'Israel', ...]
|
100
|
+
middle_east.map([:id, :name]) # => [[1, 'Egypt'], [3, 'Turkey'], [2, 'Israel'], ...]
|
100
101
|
|
101
|
-
Or getting results as a hash via +
|
102
|
+
Or getting results as a hash via +as_hash+, with one column as key and another as value:
|
102
103
|
|
103
|
-
middle_east.
|
104
|
+
middle_east.as_hash(:name, :area) # => {'Israel' => 20000, 'Turkey' => 120000, ...}
|
104
105
|
|
105
106
|
== Getting Started
|
106
107
|
|
@@ -118,7 +119,12 @@ The connection URL can also include such stuff as the user name, password, and p
|
|
118
119
|
You can also specify optional parameters, such as the connection pool size, or loggers for logging SQL queries:
|
119
120
|
|
120
121
|
DB = Sequel.connect("postgres://user:password@host:port/database_name",
|
121
|
-
:
|
122
|
+
max_connections: 10, logger: Logger.new('log/db.log'))
|
123
|
+
|
124
|
+
It is also possible to use a hash instead of a connection URL, but make sure to include the :adapter option in this case:
|
125
|
+
|
126
|
+
DB = Sequel.connect(adapter: :postgres, user: 'user', password: 'password', host: 'host', port: port,
|
127
|
+
database: 'database_name', max_connections: 10, logger: Logger.new('log/db.log'))
|
122
128
|
|
123
129
|
You can specify a block to connect, which will disconnect from the database after it completes:
|
124
130
|
|
@@ -166,7 +172,7 @@ Datasets are the primary way records are retrieved and manipulated. They are ge
|
|
166
172
|
posts = DB.from(:posts)
|
167
173
|
posts = DB[:posts] # same
|
168
174
|
|
169
|
-
Datasets will only fetch records when you tell them to. They can be manipulated to filter records, change ordering, join tables, etc
|
175
|
+
Datasets will only fetch records when you tell them to. They can be manipulated to filter records, change ordering, join tables, etc. Datasets are always frozen, and they are safe to use by multiple threads concurrently.
|
170
176
|
|
171
177
|
=== Retrieving Records
|
172
178
|
|
@@ -175,7 +181,7 @@ You can retrieve all records by using the +all+ method:
|
|
175
181
|
posts.all
|
176
182
|
# SELECT * FROM posts
|
177
183
|
|
178
|
-
The all method returns an array of hashes, where each hash corresponds to a record.
|
184
|
+
The +all+ method returns an array of hashes, where each hash corresponds to a record.
|
179
185
|
|
180
186
|
You can also iterate through records one at a time using +each+:
|
181
187
|
|
@@ -188,68 +194,92 @@ Or perform more advanced stuff:
|
|
188
194
|
|
189
195
|
You can also retrieve the first record in a dataset:
|
190
196
|
|
191
|
-
posts.first
|
192
|
-
# SELECT * FROM posts LIMIT 1
|
197
|
+
posts.order(:id).first
|
198
|
+
# SELECT * FROM posts ORDER BY id LIMIT 1
|
193
199
|
|
194
|
-
|
200
|
+
Note that you can get the first record in a dataset even if it isn't ordered:
|
195
201
|
|
196
|
-
posts
|
197
|
-
# SELECT * FROM posts
|
202
|
+
posts.first
|
203
|
+
# SELECT * FROM posts LIMIT 1
|
198
204
|
|
199
205
|
If the dataset is ordered, you can also ask for the last record:
|
200
206
|
|
201
207
|
posts.order(:stamp).last
|
202
208
|
# SELECT * FROM posts ORDER BY stamp DESC LIMIT 1
|
203
209
|
|
210
|
+
You can also provide a filter when asking for a single record:
|
211
|
+
|
212
|
+
posts.first(:id => 1)
|
213
|
+
# SELECT * FROM posts WHERE id = 1 LIMIT 1
|
214
|
+
|
215
|
+
Or retrieve a single value for a specific record:
|
216
|
+
|
217
|
+
posts.where(:id => 1).get(:name)
|
218
|
+
# SELECT name FROM posts WHERE id = 1 LIMIT 1
|
219
|
+
|
204
220
|
=== Filtering Records
|
205
221
|
|
206
|
-
|
222
|
+
The most common way to filter records is to provide a hash of values to match to +where+:
|
207
223
|
|
208
|
-
my_posts = posts.where(:
|
209
|
-
# WHERE category = 'ruby' AND author = 'david'
|
224
|
+
my_posts = posts.where(category: 'ruby', author: 'david')
|
225
|
+
# WHERE ((category = 'ruby') AND (author = 'david'))
|
210
226
|
|
211
227
|
You can also specify ranges:
|
212
228
|
|
213
|
-
my_posts = posts.where(:
|
214
|
-
# WHERE stamp >= '2010-06-30' AND stamp <= '2010-07-07'
|
229
|
+
my_posts = posts.where(stamp: (Date.today - 14)..(Date.today - 7))
|
230
|
+
# WHERE ((stamp >= '2010-06-30') AND (stamp <= '2010-07-07'))
|
215
231
|
|
216
232
|
Or arrays of values:
|
217
233
|
|
218
|
-
my_posts = posts.where(:
|
219
|
-
# WHERE category IN ('ruby', 'postgres', 'linux')
|
234
|
+
my_posts = posts.where(category: ['ruby', 'postgres', 'linux'])
|
235
|
+
# WHERE (category IN ('ruby', 'postgres', 'linux'))
|
220
236
|
|
221
|
-
|
237
|
+
By passing a block to where, you can use expressions (this is fairly "magical"):
|
222
238
|
|
223
239
|
my_posts = posts.where{stamp > Date.today << 1}
|
224
|
-
# WHERE stamp > '2010-06-14'
|
240
|
+
# WHERE (stamp > '2010-06-14')
|
225
241
|
my_posts = posts.where{stamp =~ Date.today}
|
226
|
-
# WHERE stamp = '2010-07-14'
|
242
|
+
# WHERE (stamp = '2010-07-14')
|
243
|
+
|
244
|
+
If you want to wrap the objects yourself, you can use expressions without the "magic":
|
227
245
|
|
228
|
-
|
246
|
+
my_posts = posts.where(Sequel[:stamp] > Date.today << 1)
|
247
|
+
# WHERE (stamp > '2010-06-14')
|
248
|
+
my_posts = posts.where(Sequel[:stamp] =~ Date.today)
|
249
|
+
# WHERE (stamp = '2010-07-14')
|
250
|
+
|
251
|
+
Some databases such as PostgreSQL and MySQL also support filtering via Regexps:
|
229
252
|
|
230
|
-
my_posts = posts.where(:
|
231
|
-
# WHERE category ~* 'ruby'
|
253
|
+
my_posts = posts.where(category: /ruby/i)
|
254
|
+
# WHERE (category ~* 'ruby')
|
232
255
|
|
233
256
|
You can also use an inverse filter via +exclude+:
|
234
257
|
|
235
|
-
my_posts = posts.exclude(:
|
236
|
-
# WHERE category NOT IN ('ruby', 'postgres', 'linux')
|
258
|
+
my_posts = posts.exclude(category: ['ruby', 'postgres', 'linux'])
|
259
|
+
# WHERE (category NOT IN ('ruby', 'postgres', 'linux'))
|
260
|
+
|
261
|
+
But note that this does a full inversion of the filter:
|
262
|
+
|
263
|
+
my_posts = posts.exclude(category: ['ruby', 'postgres', 'linux'], id: 1)
|
264
|
+
# WHERE ((category NOT IN ('ruby', 'postgres', 'linux')) OR (id != 1))
|
237
265
|
|
238
|
-
|
266
|
+
If at any point you want to use a custom SQL fragment for part of a query,
|
267
|
+
you can do so via +Sequel.lit+:
|
239
268
|
|
240
|
-
posts.where('stamp IS NOT NULL')
|
241
|
-
# WHERE stamp IS NOT NULL
|
269
|
+
posts.where(Sequel.lit('stamp IS NOT NULL'))
|
270
|
+
# WHERE (stamp IS NOT NULL)
|
242
271
|
|
243
|
-
You can
|
272
|
+
You can safely interpolate parameters into the custom SQL fragment by
|
273
|
+
providing them as additional arguments:
|
244
274
|
|
245
275
|
author_name = 'JKR'
|
246
|
-
posts.where('(stamp < ?) AND (author != ?)', Date.today - 3, author_name)
|
247
|
-
# WHERE (stamp < '2010-07-11') AND (author != 'JKR')
|
276
|
+
posts.where(Sequel.lit('(stamp < ?) AND (author != ?)', Date.today - 3, author_name))
|
277
|
+
# WHERE ((stamp < '2010-07-11') AND (author != 'JKR'))
|
248
278
|
|
249
279
|
Datasets can also be used as subqueries:
|
250
280
|
|
251
|
-
DB[:items].where(
|
252
|
-
# WHERE price > (SELECT avg(price) + 100 FROM items)
|
281
|
+
DB[:items].where(Sequel[:price] > DB[:items].select{avg(price) + 100})
|
282
|
+
# WHERE (price > (SELECT avg(price) + 100 FROM items))
|
253
283
|
|
254
284
|
After filtering, you can retrieve the matching records by using any of the retrieval methods:
|
255
285
|
|
@@ -268,7 +298,7 @@ issues that you should be aware of when using Sequel.
|
|
268
298
|
Counting records is easy using +count+:
|
269
299
|
|
270
300
|
posts.where(Sequel.like(:category, '%ruby%')).count
|
271
|
-
# SELECT COUNT(*) FROM posts WHERE category LIKE '%ruby%'
|
301
|
+
# SELECT COUNT(*) FROM posts WHERE (category LIKE '%ruby%' ESCAPE '\')
|
272
302
|
|
273
303
|
And you can also query maximum/minimum values via +max+ and +min+:
|
274
304
|
|
@@ -294,18 +324,15 @@ Ordering datasets is simple using +order+:
|
|
294
324
|
posts.order(:stamp, :name)
|
295
325
|
# ORDER BY stamp, name
|
296
326
|
|
297
|
-
|
327
|
+
+order+ always overrides the existing order:
|
298
328
|
|
299
329
|
posts.order(:stamp).order(:name)
|
300
330
|
# ORDER BY name
|
301
331
|
|
302
|
-
|
332
|
+
If you would like to add to the existing order, use +order_append+ or +order_prepend+:
|
303
333
|
|
304
334
|
posts.order(:stamp).order_append(:name)
|
305
335
|
# ORDER BY stamp, name
|
306
|
-
|
307
|
-
The +order_prepend+ method can be used as well:
|
308
|
-
|
309
336
|
posts.order(:stamp).order_prepend(:name)
|
310
337
|
# ORDER BY name, stamp
|
311
338
|
|
@@ -318,7 +345,7 @@ You can also specify descending order:
|
|
318
345
|
|
319
346
|
=== Core Extensions
|
320
347
|
|
321
|
-
Note the use of <tt>Sequel.desc(:stamp)</tt> in the above example. Much of Sequel's DSL uses this style, calling methods on the Sequel module that return SQL expression objects. Sequel also ships with a {core_extensions extension}[rdoc-ref:doc/core_extensions.rdoc]
|
348
|
+
Note the use of <tt>Sequel.desc(:stamp)</tt> in the above example. Much of Sequel's DSL uses this style, calling methods on the Sequel module that return SQL expression objects. Sequel also ships with a {core_extensions extension}[rdoc-ref:doc/core_extensions.rdoc] that integrates Sequel's DSL better into the Ruby language, allowing you to write:
|
322
349
|
|
323
350
|
:stamp.desc
|
324
351
|
|
@@ -335,7 +362,7 @@ Selecting specific columns to be returned is also simple using +select+:
|
|
335
362
|
posts.select(:stamp, :name)
|
336
363
|
# SELECT stamp, name FROM posts
|
337
364
|
|
338
|
-
|
365
|
+
Like +order+, +select+ overrides an existing selection:
|
339
366
|
|
340
367
|
posts.select(:stamp).select(:name)
|
341
368
|
# SELECT name FROM posts
|
@@ -349,52 +376,81 @@ As you might expect, there is an +order_append+ equivalent for +select+ called +
|
|
349
376
|
|
350
377
|
Deleting records from the table is done with +delete+:
|
351
378
|
|
352
|
-
posts.where(
|
353
|
-
# DELETE FROM posts WHERE stamp < '2010-07-11'
|
379
|
+
posts.where(Sequel[:stamp] < Date.today - 3).delete
|
380
|
+
# DELETE FROM posts WHERE (stamp < '2010-07-11')
|
354
381
|
|
355
382
|
Be very careful when deleting, as +delete+ affects all rows in the dataset.
|
356
383
|
Call +where+ first and +delete+ second:
|
357
384
|
|
358
385
|
# DO THIS:
|
359
|
-
posts.where(
|
386
|
+
posts.where(Sequel[:stamp] < Date.today - 7).delete
|
360
387
|
# NOT THIS:
|
361
|
-
posts.delete.where(
|
388
|
+
posts.delete.where(Sequel[:stamp] < Date.today - 7)
|
362
389
|
|
363
390
|
=== Inserting Records
|
364
391
|
|
365
392
|
Inserting records into the table is done with +insert+:
|
366
393
|
|
367
|
-
posts.insert(:
|
394
|
+
posts.insert(category: 'ruby', author: 'david')
|
368
395
|
# INSERT INTO posts (category, author) VALUES ('ruby', 'david')
|
369
396
|
|
370
397
|
=== Updating Records
|
371
398
|
|
372
399
|
Updating records in the table is done with +update+:
|
373
400
|
|
374
|
-
posts.where(
|
375
|
-
# UPDATE posts SET state = 'archived' WHERE stamp < '2010-07-07'
|
401
|
+
posts.where(Sequel[:stamp] < Date.today - 7).update(state: 'archived')
|
402
|
+
# UPDATE posts SET state = 'archived' WHERE (stamp < '2010-07-07')
|
376
403
|
|
377
|
-
You can
|
404
|
+
You can provide arbitrary expressions when choosing what values to set:
|
378
405
|
|
379
|
-
posts.where
|
380
|
-
# UPDATE posts SET backup_number = backup_number + 1 WHERE stamp < '2010-07-07'
|
406
|
+
posts.where(Sequel[:stamp] < Date.today - 7).update(backup_number: Sequel[:backup_number] + 1)
|
407
|
+
# UPDATE posts SET backup_number = (backup_number + 1) WHERE (stamp < '2010-07-07'))))
|
381
408
|
|
382
409
|
As with +delete+, +update+ affects all rows in the dataset, so +where+ first,
|
383
410
|
+update+ second:
|
384
411
|
|
385
412
|
# DO THIS:
|
386
|
-
posts.where(
|
413
|
+
posts.where(Sequel[:stamp] < Date.today - 7).update(:state => 'archived')
|
387
414
|
# NOT THIS:
|
388
|
-
posts.update(:state => 'archived').where(
|
415
|
+
posts.update(:state => 'archived').where(Sequel[:stamp] < Date.today - 7)
|
416
|
+
|
417
|
+
=== Merging records
|
418
|
+
|
419
|
+
Merging records using the SQL MERGE statement is done using <tt>merge*</tt> methods.
|
420
|
+
You use +merge_using+ to specify the merge source and join conditions.
|
421
|
+
You can use +merge_insert+, +merge_delete+, and/or +merge_update+ to set the
|
422
|
+
INSERT, DELETE, and UPDATE clauses for the merge. +merge_insert+ takes the same
|
423
|
+
arguments as +insert+, and +merge_update+ takes the same arguments as +update+.
|
424
|
+
+merge_insert+, +merge_delete+, and +merge_update+ can all be called with blocks,
|
425
|
+
to set the conditions for the related INSERT, DELETE, or UPDATE.
|
426
|
+
|
427
|
+
Finally, after calling all of the other <tt>merge_*</tt> methods, you call +merge+
|
428
|
+
to run the MERGE statement on the database.
|
429
|
+
|
430
|
+
ds = DB[:m1]
|
431
|
+
merge_using(:m2, i1: :i2).
|
432
|
+
merge_insert(i1: :i2, a: Sequel[:b]+11).
|
433
|
+
merge_delete{a > 30}.
|
434
|
+
merge_update(i1: Sequel[:i1]+:i2+10, a: Sequel[:a]+:b+20)
|
435
|
+
|
436
|
+
ds.merge
|
437
|
+
# MERGE INTO m1 USING m2 ON (i1 = i2)
|
438
|
+
# WHEN NOT MATCHED THEN INSERT (i1, a) VALUES (i2, (b + 11))
|
439
|
+
# WHEN MATCHED AND (a > 30) THEN DELETE
|
440
|
+
# WHEN MATCHED THEN UPDATE SET i1 = (i1 + i2 + 10), a = (a + b + 20)
|
389
441
|
|
390
442
|
=== Transactions
|
391
443
|
|
392
|
-
You can wrap
|
444
|
+
You can wrap a block of code in a database transaction using the <tt>Database#transaction</tt> method:
|
393
445
|
|
394
446
|
DB.transaction do
|
395
|
-
|
396
|
-
posts.
|
447
|
+
# BEGIN
|
448
|
+
posts.insert(category: 'ruby', author: 'david')
|
449
|
+
# INSERT
|
450
|
+
posts.where(Sequel[:stamp] < Date.today - 7).update(:state => 'archived')
|
451
|
+
# UPDATE
|
397
452
|
end
|
453
|
+
# COMMIT
|
398
454
|
|
399
455
|
If the block does not raise an exception, the transaction will be committed.
|
400
456
|
If the block does raise an exception, the transaction will be rolled back,
|
@@ -403,21 +459,24 @@ and not raise an exception outside the block, you can raise the
|
|
403
459
|
<tt>Sequel::Rollback</tt> exception inside the block:
|
404
460
|
|
405
461
|
DB.transaction do
|
462
|
+
# BEGIN
|
406
463
|
posts.insert(:category => 'ruby', :author => 'david')
|
407
|
-
|
464
|
+
# INSERT
|
465
|
+
if posts.where('stamp < ?', Date.today - 7).update(:state => 'archived') == 0
|
466
|
+
# UPDATE
|
408
467
|
raise Sequel::Rollback
|
409
468
|
end
|
410
469
|
end
|
470
|
+
# ROLLBACK
|
411
471
|
|
412
472
|
=== Joining Tables
|
413
473
|
|
414
474
|
Sequel makes it easy to join tables:
|
415
475
|
|
416
|
-
order_items = DB[:items].join(:order_items, :
|
417
|
-
|
418
|
-
#
|
419
|
-
#
|
420
|
-
# WHERE order_id = 1234
|
476
|
+
order_items = DB[:items].join(:order_items, item_id: :id).where(order_id: 1234)
|
477
|
+
# SELECT * FROM items
|
478
|
+
# INNER JOIN order_items ON (order_items.item_id = items.id)
|
479
|
+
# WHERE (order_id = 1234)
|
421
480
|
|
422
481
|
The important thing to note here is that item_id is automatically qualified with
|
423
482
|
the table being joined, and id is automatically qualified with the last table
|
@@ -426,9 +485,9 @@ joined.
|
|
426
485
|
You can then do anything you like with the dataset:
|
427
486
|
|
428
487
|
order_total = order_items.sum(:price)
|
429
|
-
# SELECT sum(price) FROM items
|
430
|
-
# ON order_items.item_id = items.id
|
431
|
-
# WHERE
|
488
|
+
# SELECT sum(price) FROM items
|
489
|
+
# INNER JOIN order_items ON (order_items.item_id = items.id)
|
490
|
+
# WHERE (order_id = 1234)
|
432
491
|
|
433
492
|
Note that the default selection in Sequel is <tt>*</tt>, which includes all columns
|
434
493
|
in all joined tables. Because Sequel returns results as a hash keyed by column name
|
@@ -440,54 +499,53 @@ selection using +select+, +select_all+, and/or +select_append+.
|
|
440
499
|
|
441
500
|
Sequel expects column names to be specified using symbols. In addition, returned hashes always use symbols as their keys. This allows you to freely mix literal values and column references in many cases. For example, the two following lines produce equivalent SQL:
|
442
501
|
|
443
|
-
items.where(:
|
502
|
+
items.where(x: 1)
|
444
503
|
# SELECT * FROM items WHERE (x = 1)
|
445
504
|
items.where(1 => :x)
|
446
505
|
# SELECT * FROM items WHERE (1 = x)"
|
447
506
|
|
448
507
|
Ruby strings are generally treated as SQL strings:
|
449
508
|
|
450
|
-
items.where(:
|
509
|
+
items.where(x: 'x')
|
451
510
|
# SELECT * FROM items WHERE (x = 'x')
|
452
511
|
|
453
512
|
=== Qualifying identifiers (column/table names)
|
454
513
|
|
455
514
|
An identifier in SQL is a name that represents a column, table, or schema.
|
456
|
-
|
515
|
+
The recommended way to qualify columns is to use <tt>Sequel[][]</tt> or +Sequel.qualify+
|
457
516
|
|
458
|
-
|
459
|
-
|
517
|
+
Sequel[:table][:column]
|
518
|
+
Sequel.qualify(:table, :column)
|
519
|
+
# table.column
|
460
520
|
|
461
|
-
|
521
|
+
You can also qualify tables with schemas:
|
462
522
|
|
463
|
-
|
464
|
-
#
|
523
|
+
Sequel[:schema][:table]
|
524
|
+
# schema.table
|
465
525
|
|
466
|
-
|
467
|
-
to select from a qualified table:
|
526
|
+
or use multi-level qualification:
|
468
527
|
|
469
|
-
|
470
|
-
#
|
528
|
+
Sequel[:schema][:table][:column]
|
529
|
+
# schema.table.column
|
471
530
|
|
472
|
-
===
|
531
|
+
=== Expression aliases
|
473
532
|
|
474
|
-
You can
|
533
|
+
You can alias identifiers using <tt>Sequel[].as</tt> or +Sequel.as+:
|
475
534
|
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
# items.price AS p
|
480
|
-
|
481
|
-
Another way to alias columns is to use the <tt>Sequel.as</tt> method:
|
482
|
-
|
483
|
-
items.literal(Sequel.as(:price, :p))
|
484
|
-
# price AS p
|
535
|
+
Sequel[:column].as(:alias)
|
536
|
+
Sequel.as(:column, :alias)
|
537
|
+
# column AS alias
|
485
538
|
|
486
539
|
You can use the <tt>Sequel.as</tt> method to alias arbitrary expressions, not just identifiers:
|
487
540
|
|
488
|
-
|
541
|
+
Sequel.as(DB[:posts].select{max(id)}, :p)
|
489
542
|
# (SELECT max(id) FROM posts) AS p
|
490
543
|
|
544
|
+
And most Sequel expression objects support an +as+ method for aliasing:
|
545
|
+
|
546
|
+
(Sequel[:column] + 2).as(:c_plus_2)
|
547
|
+
# (column + 2) AS c_plus_2
|
548
|
+
|
491
549
|
== Sequel Models
|
492
550
|
|
493
551
|
A model class wraps a dataset, and an instance of that class wraps a single record in the dataset.
|
@@ -504,38 +562,37 @@ implements the active record pattern).
|
|
504
562
|
|
505
563
|
Sequel model classes assume that the table name is an underscored plural of the class name:
|
506
564
|
|
507
|
-
Post.table_name
|
565
|
+
Post.table_name # => :posts
|
508
566
|
|
509
567
|
You can explicitly set the table name or even the dataset used:
|
510
568
|
|
511
|
-
class Post < Sequel::Model(:my_posts)
|
512
|
-
end
|
569
|
+
class Post < Sequel::Model(:my_posts); end
|
513
570
|
# or:
|
514
|
-
Post
|
571
|
+
class Post < Sequel::Model(DB[:my_posts]); end
|
515
572
|
|
516
|
-
If you
|
573
|
+
If you pass a symbol to the <tt>Sequel::Model</tt> method, it assumes you are referring to the table with the same name. You can also call it with a dataset, which will set the defaults for all retrievals for that model:
|
517
574
|
|
518
|
-
Post
|
519
|
-
Post
|
575
|
+
class Post < Sequel::Model(DB[:my_posts].where(category: 'ruby')); end
|
576
|
+
class Post < Sequel::Model(DB[:my_posts].select(:id, :name).order(:date)); end
|
520
577
|
|
521
578
|
=== Model instances
|
522
579
|
|
523
|
-
Model instances are identified by a primary key.
|
580
|
+
Model instances are identified by a primary key. Sequel queries the database to determine the primary key for each model. The <tt>Model.[]</tt> method can be used to fetch records by their primary key:
|
524
581
|
|
525
582
|
post = Post[123]
|
526
583
|
|
527
584
|
The +pk+ method is used to retrieve the record's primary key value:
|
528
585
|
|
529
|
-
post.pk
|
586
|
+
post.pk # => 123
|
530
587
|
|
531
|
-
|
588
|
+
If you want to override which column(s) to use as the primary key, you can use +set_primary_key+:
|
532
589
|
|
533
590
|
class Post < Sequel::Model
|
534
591
|
set_primary_key [:category, :title]
|
535
592
|
end
|
536
593
|
|
537
594
|
post = Post['ruby', 'hello world']
|
538
|
-
post.pk
|
595
|
+
post.pk # => ['ruby', 'hello world']
|
539
596
|
|
540
597
|
You can also define a model class that does not have a primary key via +no_primary_key+, but then you lose the ability to easily update and delete records:
|
541
598
|
|
@@ -543,39 +600,43 @@ You can also define a model class that does not have a primary key via +no_prima
|
|
543
600
|
|
544
601
|
A single model instance can also be fetched by specifying a condition:
|
545
602
|
|
546
|
-
post = Post
|
603
|
+
post = Post.first(title: 'hello world')
|
547
604
|
post = Post.first{num_comments < 10}
|
548
605
|
|
606
|
+
The dataset for a model class returns rows of model instances instead of plain hashes:
|
607
|
+
|
608
|
+
DB[:posts].first.class # => Hash
|
609
|
+
Post.first.class # => Post
|
610
|
+
|
549
611
|
=== Acts like a dataset
|
550
612
|
|
551
613
|
A model class forwards many methods to the underlying dataset. This means that you can use most of the +Dataset+ API to create customized queries that return model instances, e.g.:
|
552
614
|
|
553
|
-
Post.where(:
|
615
|
+
Post.where(category: 'ruby').each{|post| p post}
|
554
616
|
|
555
617
|
You can also manipulate the records in the dataset:
|
556
618
|
|
557
619
|
Post.where{num_comments < 7}.delete
|
558
|
-
Post.where(Sequel.like(:title, /ruby/)).update(:
|
620
|
+
Post.where(Sequel.like(:title, /ruby/)).update(category: 'ruby')
|
559
621
|
|
560
622
|
=== Accessing record values
|
561
623
|
|
562
624
|
A model instance stores its values as a hash with column symbol keys, which you can access directly via the +values+ method:
|
563
625
|
|
564
|
-
post.values
|
626
|
+
post.values # => {:id => 123, :category => 'ruby', :title => 'hello world'}
|
565
627
|
|
566
628
|
You can read the record values as object attributes, assuming the attribute names are valid columns in the model's dataset:
|
567
629
|
|
568
|
-
post.id
|
569
|
-
post.title
|
630
|
+
post.id # => 123
|
631
|
+
post.title # => 'hello world'
|
570
632
|
|
571
633
|
If the record's attributes names are not valid columns in the model's dataset (maybe because you used +select_append+ to add a computed value column), you can use <tt>Model#[]</tt> to access the values:
|
572
634
|
|
573
|
-
post[:id]
|
574
|
-
post[:title]
|
635
|
+
post[:id] # => 123
|
636
|
+
post[:title] # => 'hello world'
|
575
637
|
|
576
638
|
You can also modify record values using attribute setters or the <tt>[]=</tt> method.
|
577
639
|
|
578
|
-
|
579
640
|
post.title = 'hey there'
|
580
641
|
post[:title] = 'hey there'
|
581
642
|
|
@@ -587,24 +648,26 @@ That will just change the value for the object, it will not update the row in th
|
|
587
648
|
|
588
649
|
You can also set the values for multiple columns in a single method call, using one of the mass-assignment methods. See the {mass assignment guide}[rdoc-ref:doc/mass_assignment.rdoc] for details. For example +set+ updates the model's column values without saving:
|
589
650
|
|
590
|
-
post.set(:
|
651
|
+
post.set(title: 'hey there', updated_by: 'foo')
|
591
652
|
|
592
653
|
and +update+ updates the model's column values and then saves the changes to the database:
|
593
654
|
|
594
|
-
post.update(:
|
655
|
+
post.update(title: 'hey there', updated_by: 'foo')
|
595
656
|
|
596
657
|
=== Creating new records
|
597
658
|
|
598
|
-
New
|
659
|
+
New model instances can be created by calling <tt>Model.new</tt>, which returns a new model instance without updating the database:
|
599
660
|
|
600
|
-
post = Post.
|
661
|
+
post = Post.new(title: 'hello world')
|
601
662
|
|
602
|
-
|
663
|
+
You can save the record to the database later by calling +save+ on the model instance:
|
603
664
|
|
604
|
-
post = Post.new
|
605
|
-
post.title = 'hello world'
|
606
665
|
post.save
|
607
666
|
|
667
|
+
If you want to create a new record and save it to the database at the same time, you can use <tt>Model.create</tt>:
|
668
|
+
|
669
|
+
post = Post.create(title: 'hello world')
|
670
|
+
|
608
671
|
You can also supply a block to <tt>Model.new</tt> and <tt>Model.create</tt>:
|
609
672
|
|
610
673
|
post = Post.new do |p|
|
@@ -631,7 +694,7 @@ You can execute custom code when creating, updating, or deleting records by defi
|
|
631
694
|
|
632
695
|
Note the use of +super+ if you define your own hook methods. Almost all <tt>Sequel::Model</tt> class and instance methods (not just hook methods) can be overridden safely, but you have to make sure to call +super+ when doing so, otherwise you risk breaking things.
|
633
696
|
|
634
|
-
For the example above, you should probably use a database trigger if you can. Hooks can be used for data integrity, but they will only enforce that integrity when you are modifying the database through model instances, and even then they are often subject to race conditions. It's best to use database triggers and constraints to enforce data integrity.
|
697
|
+
For the example above, you should probably use a database trigger if you can. Hooks can be used for data integrity, but they will only enforce that integrity when you are modifying the database through model instances, and even then they are often subject to race conditions. It's best to use database triggers and database constraints to enforce data integrity.
|
635
698
|
|
636
699
|
=== Deleting records
|
637
700
|
|
@@ -663,21 +726,21 @@ Associations are used in order to specify relationships between model classes th
|
|
663
726
|
|
664
727
|
+many_to_one+ and +one_to_one+ create a getter and setter for each model object:
|
665
728
|
|
666
|
-
post = Post.create(:
|
667
|
-
post.author = Author
|
729
|
+
post = Post.create(name: 'hi!')
|
730
|
+
post.author = Author.first(name: 'Sharon')
|
668
731
|
post.author
|
669
732
|
|
670
733
|
+one_to_many+ and +many_to_many+ create a getter method, a method for adding an object to the association, a method for removing an object from the association, and a method for removing all associated objects from the association:
|
671
734
|
|
672
|
-
post = Post.create(:
|
735
|
+
post = Post.create(name: 'hi!')
|
673
736
|
post.comments
|
674
737
|
|
675
|
-
comment = Comment.create(:
|
738
|
+
comment = Comment.create(text: 'hi')
|
676
739
|
post.add_comment(comment)
|
677
740
|
post.remove_comment(comment)
|
678
741
|
post.remove_all_comments
|
679
742
|
|
680
|
-
tag = Tag.create(:
|
743
|
+
tag = Tag.create(tag: 'interesting')
|
681
744
|
post.add_tag(tag)
|
682
745
|
post.remove_tag(tag)
|
683
746
|
post.remove_all_tags
|
@@ -690,7 +753,7 @@ All associations add a dataset method that can be used to further filter or reor
|
|
690
753
|
post.comments_dataset.destroy
|
691
754
|
|
692
755
|
# Return all tags related to this post with no subscribers, ordered by the tag's name
|
693
|
-
post.tags_dataset.where(:
|
756
|
+
post.tags_dataset.where(subscribers: 0).order(:name).all
|
694
757
|
|
695
758
|
=== Eager Loading
|
696
759
|
|
@@ -732,36 +795,36 @@ Associations can be eagerly loaded via +eager+ and the <tt>:eager</tt> associati
|
|
732
795
|
Post.eager(:person).eager(:tags).all
|
733
796
|
|
734
797
|
# Cascading via .eager
|
735
|
-
Tag.eager(:
|
798
|
+
Tag.eager(posts: :replies).all
|
736
799
|
|
737
800
|
# Will also grab all associated posts' tags (because of :eager)
|
738
|
-
Reply.eager(:
|
801
|
+
Reply.eager(person: :posts).all
|
739
802
|
|
740
803
|
# No depth limit (other than memory/stack), and will also grab posts' tags
|
741
804
|
# Loads all people, their posts, their posts' tags, replies to those posts,
|
742
805
|
# the person for each reply, the tag for each reply, and all posts and
|
743
806
|
# replies that have that tag. Uses a total of 8 queries.
|
744
|
-
Person.eager(:
|
807
|
+
Person.eager(posts: {replies: [:person, {tags: [:posts, :replies]}]}).all
|
745
808
|
|
746
|
-
In addition to using +eager+, you can also use +eager_graph+, which will use a single query to get the object and all associated objects. This may be necessary if you want to filter or order the result set based on columns in associated tables. It works with cascading as well, the API is
|
809
|
+
In addition to using +eager+, you can also use +eager_graph+, which will use a single query to get the object and all associated objects. This may be necessary if you want to filter or order the result set based on columns in associated tables. It works with cascading as well, the API is similar. Note that using +eager_graph+ to eagerly load multiple <tt>*_to_many</tt> associations will cause the result set to be a cartesian product, so you should be very careful with your filters when using it in that case.
|
747
810
|
|
748
|
-
You can dynamically customize the eagerly loaded dataset by using
|
811
|
+
You can dynamically customize the eagerly loaded dataset by using a proc. This proc is passed the dataset used for eager loading, and should return a modified copy of that dataset:
|
749
812
|
|
750
813
|
# Eagerly load only replies containing 'foo'
|
751
|
-
Post.eager(:
|
814
|
+
Post.eager(replies: proc{|ds| ds.where(Sequel.like(text, '%foo%'))}).all
|
752
815
|
|
753
816
|
This also works when using +eager_graph+, in which case the proc is called with dataset to graph into the current dataset:
|
754
817
|
|
755
|
-
Post.eager_graph(:
|
818
|
+
Post.eager_graph(replies: proc{|ds| ds.where(Sequel.like(text, '%foo%'))}).all
|
756
819
|
|
757
820
|
You can dynamically customize eager loads for both +eager+ and +eager_graph+ while also cascading, by making the value a single entry hash with the proc as a key, and the cascaded associations as the value:
|
758
821
|
|
759
822
|
# Eagerly load only replies containing 'foo', and the person and tags for those replies
|
760
|
-
Post.eager(:
|
823
|
+
Post.eager(replies: {proc{|ds| ds.where(Sequel.like(text, '%foo%'))} => [:person, :tags]}).all
|
761
824
|
|
762
825
|
=== Joining with Associations
|
763
826
|
|
764
|
-
You can use the association_join method to add a join to the model's dataset based on the assocation:
|
827
|
+
You can use the +association_join+ method to add a join to the model's dataset based on the assocation:
|
765
828
|
|
766
829
|
Post.association_join(:author)
|
767
830
|
# SELECT * FROM posts
|
@@ -775,7 +838,7 @@ This comes with variants for different join types:
|
|
775
838
|
|
776
839
|
Similar to the eager loading methods, you can use multiple associations and nested associations:
|
777
840
|
|
778
|
-
Post.association_join(:author, :
|
841
|
+
Post.association_join(:author, replies: :person).all
|
779
842
|
# SELECT * FROM posts
|
780
843
|
# INNER JOIN authors AS author ON (author.id = posts.author_id)
|
781
844
|
# INNER JOIN replies ON (replies.post_id = posts.id)
|
@@ -787,27 +850,44 @@ The recommended way to implement table-wide logic by defining methods on the dat
|
|
787
850
|
|
788
851
|
class Post < Sequel::Model
|
789
852
|
dataset_module do
|
790
|
-
def
|
853
|
+
def with_few_comments
|
791
854
|
where{num_comments < 30}
|
792
855
|
end
|
793
856
|
|
794
|
-
def
|
795
|
-
|
857
|
+
def clean_boring
|
858
|
+
with_few_comments.delete
|
796
859
|
end
|
797
860
|
end
|
798
861
|
end
|
799
862
|
|
800
863
|
This allows you to have access to your model API from filtered datasets as well:
|
801
864
|
|
802
|
-
Post.where(:
|
865
|
+
Post.where(category: 'ruby').clean_boring
|
866
|
+
# DELETE FROM posts WHERE ((category = 'ruby') AND (num_comments < 30))
|
803
867
|
|
804
|
-
|
868
|
+
Inside +dataset_module+ blocks, there are numerous methods that support easy creation of dataset methods.
|
869
|
+
Most of these methods are named after the dataset methods themselves, such as +select+, +order+, and
|
870
|
+
+group+:
|
805
871
|
|
806
872
|
class Post < Sequel::Model
|
807
|
-
|
808
|
-
|
873
|
+
dataset_module do
|
874
|
+
where(:with_few_comments, Sequel[:num_comments] < 30)
|
875
|
+
select :with_title_and_date, :id, :title, :post_date
|
876
|
+
order :by_post_date, :post_date
|
877
|
+
limit :top10, 10
|
878
|
+
end
|
809
879
|
end
|
810
880
|
|
881
|
+
Post.with_few_comments.with_title_and_date.by_post_date.top10
|
882
|
+
# SELECT id, title, post_date
|
883
|
+
# FROM posts
|
884
|
+
# ORDER BY post_date
|
885
|
+
# LIMIT 10
|
886
|
+
|
887
|
+
One advantage of using these methods inside dataset_module blocks, instead of
|
888
|
+
defining methods manually, is that the created methods will generally cache
|
889
|
+
the resulting values and result in better performance.
|
890
|
+
|
811
891
|
=== Model Validations
|
812
892
|
|
813
893
|
You can define a +validate+ method for your model, which +save+
|
@@ -815,8 +895,7 @@ will check before attempting to save the model in the database.
|
|
815
895
|
If an attribute of the model isn't valid, you should add an error
|
816
896
|
message for that attribute to the model object's +errors+. If an
|
817
897
|
object has any errors added by the validate method, +save+ will
|
818
|
-
raise an error
|
819
|
-
(the +raise_on_save_failure+ flag).
|
898
|
+
raise an error by default:
|
820
899
|
|
821
900
|
class Post < Sequel::Model
|
822
901
|
def validate
|
@@ -825,3 +904,30 @@ raise an error or return false depending on how it is configured
|
|
825
904
|
errors.add(:written_on, "should be in the past") if written_on >= Time.now
|
826
905
|
end
|
827
906
|
end
|
907
|
+
|
908
|
+
== Testing Sequel
|
909
|
+
|
910
|
+
Please see the {testing guide}[rdoc-ref:doc/testing.rdoc] for recommendations on testing
|
911
|
+
applications that use Sequel, as well as the how to run the tests for Sequel itself.
|
912
|
+
|
913
|
+
== Sequel Release Policy
|
914
|
+
|
915
|
+
New major versions of Sequel do not have a defined release policy, but historically have
|
916
|
+
occurred once every few years.
|
917
|
+
|
918
|
+
New minor versions of Sequel are released around once a month near the start of the month.
|
919
|
+
|
920
|
+
New tiny versions of Sequel are only released to address security issues or regressions
|
921
|
+
in the most current release.
|
922
|
+
|
923
|
+
== Ruby Support Policy
|
924
|
+
|
925
|
+
Sequel fully supports the currently supported versions of Ruby (MRI) and JRuby. It may
|
926
|
+
support unsupported versions of Ruby or JRuby, but such support may be dropped in any
|
927
|
+
minor version if keeping it becomes a support issue. The minimum Ruby version
|
928
|
+
required to run the current version of Sequel is 1.9.2, and the minimum JRuby version is
|
929
|
+
9.0.0.0.
|
930
|
+
|
931
|
+
== Maintainer
|
932
|
+
|
933
|
+
Jeremy Evans <code@jeremyevans.net>
|