sequel 4.49.0 → 5.0.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 +4 -4
- data/CHANGELOG +70 -0
- data/README.rdoc +195 -136
- data/Rakefile +26 -42
- data/bin/sequel +3 -5
- data/doc/advanced_associations.rdoc +86 -163
- data/doc/association_basics.rdoc +197 -274
- data/doc/bin_sequel.rdoc +5 -3
- data/doc/cheat_sheet.rdoc +66 -43
- data/doc/code_order.rdoc +1 -8
- data/doc/core_extensions.rdoc +81 -56
- data/doc/dataset_basics.rdoc +8 -17
- data/doc/dataset_filtering.rdoc +81 -86
- data/doc/extensions.rdoc +3 -10
- data/doc/mass_assignment.rdoc +73 -30
- data/doc/migration.rdoc +19 -36
- data/doc/model_dataset_method_design.rdoc +14 -17
- data/doc/model_hooks.rdoc +15 -25
- data/doc/model_plugins.rdoc +10 -10
- data/doc/mssql_stored_procedures.rdoc +3 -3
- data/doc/object_model.rdoc +52 -70
- data/doc/opening_databases.rdoc +39 -32
- data/doc/postgresql.rdoc +48 -38
- data/doc/prepared_statements.rdoc +27 -22
- data/doc/querying.rdoc +173 -150
- data/doc/reflection.rdoc +5 -6
- data/doc/release_notes/5.0.0.txt +159 -0
- data/doc/schema_modification.rdoc +63 -60
- data/doc/security.rdoc +97 -88
- data/doc/sharding.rdoc +43 -30
- data/doc/sql.rdoc +53 -65
- data/doc/testing.rdoc +3 -5
- data/doc/thread_safety.rdoc +2 -4
- data/doc/transactions.rdoc +18 -17
- data/doc/validations.rdoc +48 -45
- data/doc/virtual_rows.rdoc +87 -115
- data/lib/sequel.rb +1 -1
- data/lib/sequel/adapters/ado.rb +9 -25
- data/lib/sequel/adapters/ado/access.rb +7 -13
- data/lib/sequel/adapters/ado/mssql.rb +2 -9
- data/lib/sequel/adapters/amalgalite.rb +3 -18
- data/lib/sequel/adapters/ibmdb.rb +9 -45
- data/lib/sequel/adapters/jdbc.rb +13 -73
- data/lib/sequel/adapters/jdbc/db2.rb +8 -37
- data/lib/sequel/adapters/jdbc/derby.rb +4 -50
- data/lib/sequel/adapters/jdbc/h2.rb +4 -25
- data/lib/sequel/adapters/jdbc/hsqldb.rb +1 -26
- data/lib/sequel/adapters/jdbc/jtds.rb +2 -9
- data/lib/sequel/adapters/jdbc/mssql.rb +1 -11
- data/lib/sequel/adapters/jdbc/mysql.rb +1 -15
- data/lib/sequel/adapters/jdbc/oracle.rb +4 -26
- data/lib/sequel/adapters/jdbc/postgresql.rb +2 -31
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +4 -17
- data/lib/sequel/adapters/jdbc/sqlite.rb +1 -7
- data/lib/sequel/adapters/jdbc/sqlserver.rb +1 -13
- data/lib/sequel/adapters/jdbc/transactions.rb +1 -14
- data/lib/sequel/adapters/mock.rb +4 -30
- data/lib/sequel/adapters/mysql.rb +7 -44
- data/lib/sequel/adapters/mysql2.rb +5 -23
- data/lib/sequel/adapters/odbc.rb +0 -19
- data/lib/sequel/adapters/odbc/db2.rb +1 -1
- data/lib/sequel/adapters/odbc/mssql.rb +4 -12
- data/lib/sequel/adapters/odbc/oracle.rb +1 -1
- data/lib/sequel/adapters/oracle.rb +7 -13
- data/lib/sequel/adapters/postgres.rb +13 -57
- data/lib/sequel/adapters/postgresql.rb +1 -1
- data/lib/sequel/adapters/shared/access.rb +11 -51
- data/lib/sequel/adapters/shared/db2.rb +3 -61
- data/lib/sequel/adapters/shared/mssql.rb +21 -157
- data/lib/sequel/adapters/shared/mysql.rb +23 -224
- data/lib/sequel/adapters/shared/oracle.rb +13 -41
- data/lib/sequel/adapters/shared/postgres.rb +44 -259
- data/lib/sequel/adapters/shared/sqlanywhere.rb +4 -96
- data/lib/sequel/adapters/shared/sqlite.rb +12 -101
- data/lib/sequel/adapters/sqlanywhere.rb +4 -23
- data/lib/sequel/adapters/sqlite.rb +2 -19
- data/lib/sequel/adapters/tinytds.rb +5 -15
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +1 -1
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +2 -4
- data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +3 -6
- data/lib/sequel/adapters/utils/replace.rb +0 -5
- data/lib/sequel/adapters/utils/stored_procedures.rb +0 -2
- data/lib/sequel/adapters/utils/unmodified_identifiers.rb +2 -0
- data/lib/sequel/ast_transformer.rb +3 -94
- data/lib/sequel/connection_pool.rb +26 -28
- data/lib/sequel/connection_pool/sharded_single.rb +1 -4
- data/lib/sequel/connection_pool/sharded_threaded.rb +97 -95
- data/lib/sequel/connection_pool/single.rb +0 -2
- data/lib/sequel/connection_pool/threaded.rb +94 -110
- data/lib/sequel/core.rb +42 -101
- data/lib/sequel/database.rb +12 -2
- data/lib/sequel/database/connecting.rb +23 -60
- data/lib/sequel/database/dataset.rb +6 -9
- data/lib/sequel/database/dataset_defaults.rb +4 -48
- data/lib/sequel/database/features.rb +5 -4
- data/lib/sequel/database/logging.rb +2 -9
- data/lib/sequel/database/misc.rb +23 -55
- data/lib/sequel/database/query.rb +8 -13
- data/lib/sequel/database/schema_generator.rb +89 -64
- data/lib/sequel/database/schema_methods.rb +61 -79
- data/lib/sequel/database/transactions.rb +4 -24
- data/lib/sequel/dataset.rb +18 -10
- data/lib/sequel/dataset/actions.rb +53 -107
- data/lib/sequel/dataset/dataset_module.rb +3 -15
- data/lib/sequel/dataset/features.rb +30 -30
- data/lib/sequel/dataset/graph.rb +40 -49
- data/lib/sequel/dataset/misc.rb +12 -37
- data/lib/sequel/dataset/placeholder_literalizer.rb +4 -4
- data/lib/sequel/dataset/prepared_statements.rb +23 -51
- data/lib/sequel/dataset/query.rb +71 -155
- data/lib/sequel/dataset/sql.rb +30 -225
- data/lib/sequel/deprecated.rb +18 -27
- data/lib/sequel/exceptions.rb +1 -17
- data/lib/sequel/extensions/_model_pg_row.rb +0 -7
- data/lib/sequel/extensions/_pretty_table.rb +1 -3
- data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
- data/lib/sequel/extensions/connection_expiration.rb +1 -1
- data/lib/sequel/extensions/connection_validator.rb +1 -1
- data/lib/sequel/extensions/constraint_validations.rb +11 -11
- data/lib/sequel/extensions/core_extensions.rb +39 -49
- data/lib/sequel/extensions/core_refinements.rb +39 -45
- data/lib/sequel/extensions/current_datetime_timestamp.rb +0 -4
- data/lib/sequel/extensions/date_arithmetic.rb +7 -7
- data/lib/sequel/extensions/duplicate_columns_handler.rb +12 -9
- data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
- data/lib/sequel/extensions/eval_inspect.rb +4 -11
- data/lib/sequel/extensions/freeze_datasets.rb +1 -69
- data/lib/sequel/extensions/from_block.rb +1 -35
- data/lib/sequel/extensions/graph_each.rb +2 -2
- data/lib/sequel/extensions/identifier_mangling.rb +9 -19
- data/lib/sequel/extensions/implicit_subquery.rb +2 -2
- data/lib/sequel/extensions/inflector.rb +4 -4
- data/lib/sequel/extensions/migration.rb +23 -40
- data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -84
- data/lib/sequel/extensions/null_dataset.rb +2 -8
- data/lib/sequel/extensions/pagination.rb +1 -17
- data/lib/sequel/extensions/pg_array.rb +20 -189
- data/lib/sequel/extensions/pg_hstore.rb +11 -50
- data/lib/sequel/extensions/pg_hstore_ops.rb +2 -2
- data/lib/sequel/extensions/pg_inet.rb +2 -15
- data/lib/sequel/extensions/pg_interval.rb +1 -20
- data/lib/sequel/extensions/pg_json.rb +7 -27
- data/lib/sequel/extensions/pg_loose_count.rb +1 -1
- data/lib/sequel/extensions/pg_range.rb +6 -121
- data/lib/sequel/extensions/pg_range_ops.rb +1 -3
- data/lib/sequel/extensions/pg_row.rb +5 -77
- data/lib/sequel/extensions/pg_row_ops.rb +2 -13
- data/lib/sequel/extensions/query.rb +3 -4
- data/lib/sequel/extensions/round_timestamps.rb +0 -6
- data/lib/sequel/extensions/schema_dumper.rb +13 -13
- data/lib/sequel/extensions/select_remove.rb +3 -3
- data/lib/sequel/extensions/split_array_nil.rb +2 -2
- data/lib/sequel/extensions/sql_comments.rb +2 -2
- data/lib/sequel/extensions/string_agg.rb +11 -8
- data/lib/sequel/extensions/symbol_aref.rb +6 -20
- data/lib/sequel/model.rb +27 -62
- data/lib/sequel/model/associations.rb +128 -131
- data/lib/sequel/model/base.rb +171 -711
- data/lib/sequel/model/default_inflections.rb +1 -1
- data/lib/sequel/model/errors.rb +0 -3
- data/lib/sequel/model/exceptions.rb +2 -6
- data/lib/sequel/model/inflections.rb +1 -26
- data/lib/sequel/model/plugins.rb +1 -0
- data/lib/sequel/plugins/active_model.rb +2 -5
- data/lib/sequel/plugins/association_dependencies.rb +15 -15
- data/lib/sequel/plugins/association_pks.rb +14 -28
- data/lib/sequel/plugins/association_proxies.rb +6 -7
- data/lib/sequel/plugins/auto_validations.rb +4 -4
- data/lib/sequel/plugins/before_after_save.rb +0 -43
- data/lib/sequel/plugins/blacklist_security.rb +9 -8
- data/lib/sequel/plugins/boolean_readers.rb +3 -3
- data/lib/sequel/plugins/boolean_subsets.rb +2 -2
- data/lib/sequel/plugins/caching.rb +5 -5
- data/lib/sequel/plugins/class_table_inheritance.rb +71 -102
- data/lib/sequel/plugins/column_conflicts.rb +2 -2
- data/lib/sequel/plugins/column_select.rb +2 -2
- data/lib/sequel/plugins/composition.rb +15 -24
- data/lib/sequel/plugins/constraint_validations.rb +4 -3
- data/lib/sequel/plugins/csv_serializer.rb +13 -20
- data/lib/sequel/plugins/dataset_associations.rb +2 -2
- data/lib/sequel/plugins/def_dataset_method.rb +5 -5
- data/lib/sequel/plugins/defaults_setter.rb +1 -1
- data/lib/sequel/plugins/delay_add_association.rb +1 -1
- data/lib/sequel/plugins/finder.rb +16 -10
- data/lib/sequel/plugins/force_encoding.rb +1 -7
- data/lib/sequel/plugins/hook_class_methods.rb +4 -106
- data/lib/sequel/plugins/input_transformer.rb +10 -11
- data/lib/sequel/plugins/insert_returning_select.rb +1 -9
- data/lib/sequel/plugins/instance_filters.rb +5 -5
- data/lib/sequel/plugins/instance_hooks.rb +7 -52
- data/lib/sequel/plugins/inverted_subsets.rb +3 -1
- data/lib/sequel/plugins/json_serializer.rb +19 -19
- data/lib/sequel/plugins/lazy_attributes.rb +1 -10
- data/lib/sequel/plugins/list.rb +6 -6
- data/lib/sequel/plugins/many_through_many.rb +11 -8
- data/lib/sequel/plugins/mssql_optimistic_locking.rb +3 -3
- data/lib/sequel/plugins/nested_attributes.rb +18 -31
- data/lib/sequel/plugins/optimistic_locking.rb +3 -3
- data/lib/sequel/plugins/pg_array_associations.rb +8 -2
- data/lib/sequel/plugins/pg_row.rb +2 -11
- data/lib/sequel/plugins/prepared_statements.rb +13 -66
- data/lib/sequel/plugins/prepared_statements_safe.rb +1 -1
- data/lib/sequel/plugins/rcte_tree.rb +7 -7
- data/lib/sequel/plugins/serialization.rb +15 -33
- data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
- data/lib/sequel/plugins/sharding.rb +2 -8
- data/lib/sequel/plugins/single_table_inheritance.rb +10 -13
- data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
- data/lib/sequel/plugins/static_cache.rb +8 -9
- data/lib/sequel/plugins/string_stripper.rb +3 -3
- data/lib/sequel/plugins/subclasses.rb +1 -1
- data/lib/sequel/plugins/subset_conditions.rb +2 -2
- data/lib/sequel/plugins/table_select.rb +2 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +4 -4
- data/lib/sequel/plugins/timestamps.rb +6 -7
- data/lib/sequel/plugins/touch.rb +4 -8
- data/lib/sequel/plugins/tree.rb +3 -3
- data/lib/sequel/plugins/typecast_on_load.rb +2 -2
- data/lib/sequel/plugins/unlimited_update.rb +1 -7
- data/lib/sequel/plugins/update_or_create.rb +3 -3
- data/lib/sequel/plugins/update_refresh.rb +3 -3
- data/lib/sequel/plugins/uuid.rb +7 -11
- data/lib/sequel/plugins/validation_class_methods.rb +10 -9
- data/lib/sequel/plugins/validation_contexts.rb +4 -4
- data/lib/sequel/plugins/validation_helpers.rb +26 -25
- data/lib/sequel/plugins/whitelist_security.rb +13 -9
- data/lib/sequel/plugins/xml_serializer.rb +24 -25
- data/lib/sequel/sql.rb +145 -276
- data/lib/sequel/timezones.rb +8 -22
- data/lib/sequel/version.rb +2 -2
- data/spec/adapter_spec.rb +1 -1
- data/spec/adapters/db2_spec.rb +2 -103
- data/spec/adapters/mssql_spec.rb +89 -68
- data/spec/adapters/mysql_spec.rb +101 -480
- data/spec/adapters/oracle_spec.rb +1 -9
- data/spec/adapters/postgres_spec.rb +312 -565
- data/spec/adapters/spec_helper.rb +12 -31
- data/spec/adapters/sqlanywhere_spec.rb +2 -77
- data/spec/adapters/sqlite_spec.rb +8 -146
- data/spec/bin_spec.rb +11 -16
- data/spec/core/connection_pool_spec.rb +173 -74
- data/spec/core/database_spec.rb +64 -244
- data/spec/core/dataset_spec.rb +81 -415
- data/spec/core/deprecated_spec.rb +3 -3
- data/spec/core/expression_filters_spec.rb +37 -144
- data/spec/core/mock_adapter_spec.rb +176 -4
- data/spec/core/object_graph_spec.rb +11 -60
- data/spec/core/placeholder_literalizer_spec.rb +1 -14
- data/spec/core/schema_generator_spec.rb +51 -40
- data/spec/core/schema_spec.rb +74 -77
- data/spec/core/spec_helper.rb +6 -24
- data/spec/core/version_spec.rb +1 -1
- data/spec/core_extensions_spec.rb +7 -83
- data/spec/core_model_spec.rb +2 -2
- data/spec/deprecation_helper.rb +2 -14
- data/spec/extensions/accessed_columns_spec.rb +1 -1
- data/spec/extensions/active_model_spec.rb +3 -3
- data/spec/extensions/after_initialize_spec.rb +1 -1
- data/spec/extensions/arbitrary_servers_spec.rb +2 -2
- data/spec/extensions/association_dependencies_spec.rb +1 -1
- data/spec/extensions/association_pks_spec.rb +4 -59
- data/spec/extensions/association_proxies_spec.rb +1 -1
- data/spec/extensions/auto_literal_strings_spec.rb +1 -12
- data/spec/extensions/auto_validations_spec.rb +1 -1
- data/spec/extensions/blacklist_security_spec.rb +1 -1
- data/spec/extensions/blank_spec.rb +1 -1
- data/spec/extensions/boolean_readers_spec.rb +1 -1
- data/spec/extensions/boolean_subsets_spec.rb +1 -1
- data/spec/extensions/caching_spec.rb +1 -1
- data/spec/extensions/class_table_inheritance_spec.rb +35 -1086
- data/spec/extensions/column_conflicts_spec.rb +1 -1
- data/spec/extensions/column_select_spec.rb +4 -4
- data/spec/extensions/columns_introspection_spec.rb +1 -1
- data/spec/extensions/columns_updated_spec.rb +1 -1
- data/spec/extensions/composition_spec.rb +1 -7
- data/spec/extensions/connection_expiration_spec.rb +3 -3
- data/spec/extensions/connection_validator_spec.rb +3 -3
- data/spec/extensions/constraint_validations_plugin_spec.rb +1 -1
- data/spec/extensions/constraint_validations_spec.rb +1 -1
- data/spec/extensions/core_refinements_spec.rb +1 -3
- data/spec/extensions/csv_serializer_spec.rb +4 -9
- data/spec/extensions/current_datetime_timestamp_spec.rb +1 -1
- data/spec/extensions/dataset_associations_spec.rb +2 -1
- data/spec/extensions/dataset_source_alias_spec.rb +1 -1
- data/spec/extensions/date_arithmetic_spec.rb +3 -3
- data/spec/extensions/def_dataset_method_spec.rb +1 -1
- data/spec/extensions/defaults_setter_spec.rb +2 -2
- data/spec/extensions/delay_add_association_spec.rb +8 -9
- data/spec/extensions/dirty_spec.rb +1 -1
- data/spec/extensions/duplicate_columns_handler_spec.rb +1 -1
- data/spec/extensions/eager_each_spec.rb +2 -2
- data/spec/extensions/empty_array_consider_nulls_spec.rb +1 -1
- data/spec/extensions/error_splitter_spec.rb +1 -1
- data/spec/extensions/error_sql_spec.rb +1 -1
- data/spec/extensions/eval_inspect_spec.rb +1 -1
- data/spec/extensions/finder_spec.rb +1 -1
- data/spec/extensions/force_encoding_spec.rb +2 -5
- data/spec/extensions/freeze_datasets_spec.rb +1 -1
- data/spec/extensions/graph_each_spec.rb +5 -5
- data/spec/extensions/hook_class_methods_spec.rb +1 -194
- data/spec/extensions/identifier_mangling_spec.rb +17 -170
- data/spec/extensions/implicit_subquery_spec.rb +1 -5
- data/spec/extensions/inflector_spec.rb +1 -1
- data/spec/extensions/input_transformer_spec.rb +7 -2
- data/spec/extensions/insert_returning_select_spec.rb +1 -1
- data/spec/extensions/instance_filters_spec.rb +1 -1
- data/spec/extensions/instance_hooks_spec.rb +1 -95
- data/spec/extensions/inverted_subsets_spec.rb +1 -1
- data/spec/extensions/json_serializer_spec.rb +1 -1
- data/spec/extensions/lazy_attributes_spec.rb +1 -7
- data/spec/extensions/list_spec.rb +1 -1
- data/spec/extensions/looser_typecasting_spec.rb +1 -1
- data/spec/extensions/many_through_many_spec.rb +1 -1
- data/spec/extensions/migration_spec.rb +2 -2
- data/spec/extensions/modification_detection_spec.rb +1 -1
- data/spec/extensions/mssql_optimistic_locking_spec.rb +1 -1
- data/spec/extensions/named_timezones_spec.rb +3 -3
- data/spec/extensions/nested_attributes_spec.rb +1 -29
- data/spec/extensions/null_dataset_spec.rb +1 -11
- data/spec/extensions/optimistic_locking_spec.rb +1 -1
- data/spec/extensions/pagination_spec.rb +1 -1
- data/spec/extensions/pg_array_associations_spec.rb +4 -1
- data/spec/extensions/pg_array_ops_spec.rb +1 -1
- data/spec/extensions/pg_array_spec.rb +3 -48
- data/spec/extensions/pg_enum_spec.rb +1 -1
- data/spec/extensions/pg_hstore_ops_spec.rb +1 -1
- data/spec/extensions/pg_hstore_spec.rb +23 -32
- data/spec/extensions/pg_inet_ops_spec.rb +1 -1
- data/spec/extensions/pg_inet_spec.rb +1 -14
- data/spec/extensions/pg_interval_spec.rb +3 -13
- data/spec/extensions/pg_json_ops_spec.rb +1 -1
- data/spec/extensions/pg_json_spec.rb +1 -13
- data/spec/extensions/pg_loose_count_spec.rb +1 -1
- data/spec/extensions/pg_range_ops_spec.rb +1 -1
- data/spec/extensions/pg_range_spec.rb +3 -88
- data/spec/extensions/pg_row_ops_spec.rb +1 -1
- data/spec/extensions/pg_row_plugin_spec.rb +1 -1
- data/spec/extensions/pg_row_spec.rb +1 -44
- data/spec/extensions/pg_static_cache_updater_spec.rb +1 -1
- data/spec/extensions/prepared_statements_safe_spec.rb +1 -1
- data/spec/extensions/prepared_statements_spec.rb +13 -48
- data/spec/extensions/pretty_table_spec.rb +1 -1
- data/spec/extensions/query_spec.rb +1 -12
- data/spec/extensions/rcte_tree_spec.rb +1 -1
- data/spec/extensions/round_timestamps_spec.rb +1 -5
- data/spec/extensions/s_spec.rb +1 -1
- data/spec/extensions/schema_caching_spec.rb +1 -1
- data/spec/extensions/schema_dumper_spec.rb +1 -1
- data/spec/extensions/select_remove_spec.rb +1 -1
- data/spec/extensions/sequel_4_dataset_methods_spec.rb +1 -1
- data/spec/extensions/serialization_modification_detection_spec.rb +1 -1
- data/spec/extensions/serialization_spec.rb +2 -14
- data/spec/extensions/server_block_spec.rb +1 -1
- data/spec/extensions/server_logging_spec.rb +2 -2
- data/spec/extensions/sharding_spec.rb +1 -1
- data/spec/extensions/shared_caching_spec.rb +1 -28
- data/spec/extensions/single_table_inheritance_spec.rb +2 -5
- data/spec/extensions/singular_table_names_spec.rb +1 -1
- data/spec/extensions/skip_create_refresh_spec.rb +1 -1
- data/spec/extensions/spec_helper.rb +5 -27
- data/spec/extensions/split_array_nil_spec.rb +1 -1
- data/spec/extensions/split_values_spec.rb +1 -1
- data/spec/extensions/sql_comments_spec.rb +1 -1
- data/spec/extensions/sql_expr_spec.rb +1 -1
- data/spec/extensions/static_cache_spec.rb +1 -1
- data/spec/extensions/string_agg_spec.rb +2 -2
- data/spec/extensions/string_date_time_spec.rb +1 -1
- data/spec/extensions/string_stripper_spec.rb +1 -1
- data/spec/extensions/subclasses_spec.rb +1 -1
- data/spec/extensions/subset_conditions_spec.rb +1 -1
- data/spec/extensions/symbol_aref_refinement_spec.rb +1 -1
- data/spec/extensions/symbol_as_refinement_spec.rb +1 -1
- data/spec/extensions/table_select_spec.rb +4 -4
- data/spec/extensions/tactical_eager_loading_spec.rb +1 -6
- data/spec/extensions/thread_local_timezones_spec.rb +1 -1
- data/spec/extensions/timestamps_spec.rb +3 -3
- data/spec/extensions/to_dot_spec.rb +1 -1
- data/spec/extensions/touch_spec.rb +1 -1
- data/spec/extensions/tree_spec.rb +1 -1
- data/spec/extensions/typecast_on_load_spec.rb +1 -1
- data/spec/extensions/unlimited_update_spec.rb +1 -1
- data/spec/extensions/update_or_create_spec.rb +1 -1
- data/spec/extensions/update_primary_key_spec.rb +4 -3
- data/spec/extensions/update_refresh_spec.rb +1 -1
- data/spec/extensions/uuid_spec.rb +10 -12
- data/spec/extensions/validate_associated_spec.rb +1 -1
- data/spec/extensions/validation_class_methods_spec.rb +3 -3
- data/spec/extensions/validation_contexts_spec.rb +1 -1
- data/spec/extensions/validation_helpers_spec.rb +10 -44
- data/spec/extensions/whitelist_security_spec.rb +5 -5
- data/spec/extensions/xml_serializer_spec.rb +3 -3
- data/spec/guards_helper.rb +2 -1
- data/spec/integration/associations_test.rb +1 -23
- data/spec/integration/database_test.rb +7 -7
- data/spec/integration/dataset_test.rb +5 -47
- data/spec/integration/eager_loader_test.rb +1 -1
- data/spec/integration/migrator_test.rb +1 -1
- data/spec/integration/model_test.rb +4 -82
- data/spec/integration/plugin_test.rb +6 -22
- data/spec/integration/prepared_statement_test.rb +8 -88
- data/spec/integration/schema_test.rb +6 -6
- data/spec/integration/spec_helper.rb +13 -21
- data/spec/integration/timezone_test.rb +5 -5
- data/spec/integration/transaction_test.rb +3 -55
- data/spec/integration/type_test.rb +9 -9
- data/spec/model/association_reflection_spec.rb +24 -9
- data/spec/model/associations_spec.rb +124 -303
- data/spec/model/base_spec.rb +18 -137
- data/spec/model/class_dataset_methods_spec.rb +2 -20
- data/spec/model/dataset_methods_spec.rb +1 -20
- data/spec/model/eager_loading_spec.rb +17 -11
- data/spec/model/hooks_spec.rb +5 -300
- data/spec/model/inflector_spec.rb +1 -1
- data/spec/model/model_spec.rb +15 -320
- data/spec/model/plugins_spec.rb +2 -16
- data/spec/model/record_spec.rb +29 -121
- data/spec/model/spec_helper.rb +5 -15
- data/spec/model/validations_spec.rb +1 -1
- data/spec/sequel_warning.rb +1 -12
- metadata +8 -64
- data/doc/active_record.rdoc +0 -927
- data/lib/sequel/adapters/cubrid.rb +0 -160
- data/lib/sequel/adapters/do.rb +0 -166
- data/lib/sequel/adapters/do/mysql.rb +0 -69
- data/lib/sequel/adapters/do/postgres.rb +0 -46
- data/lib/sequel/adapters/do/sqlite3.rb +0 -41
- data/lib/sequel/adapters/jdbc/as400.rb +0 -92
- data/lib/sequel/adapters/jdbc/cubrid.rb +0 -65
- data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -37
- data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -34
- data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -34
- data/lib/sequel/adapters/odbc/progress.rb +0 -12
- data/lib/sequel/adapters/shared/cubrid.rb +0 -245
- data/lib/sequel/adapters/shared/firebird.rb +0 -261
- data/lib/sequel/adapters/shared/informix.rb +0 -63
- data/lib/sequel/adapters/shared/progress.rb +0 -40
- data/lib/sequel/adapters/swift.rb +0 -169
- data/lib/sequel/adapters/swift/mysql.rb +0 -50
- data/lib/sequel/adapters/swift/postgres.rb +0 -49
- data/lib/sequel/adapters/swift/sqlite.rb +0 -48
- data/lib/sequel/adapters/utils/pg_types.rb +0 -4
- data/lib/sequel/dataset/mutation.rb +0 -98
- data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +0 -117
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -8
- data/lib/sequel/extensions/filter_having.rb +0 -65
- data/lib/sequel/extensions/hash_aliases.rb +0 -51
- data/lib/sequel/extensions/meta_def.rb +0 -37
- data/lib/sequel/extensions/query_literals.rb +0 -86
- data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -26
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -133
- data/lib/sequel/extensions/set_overrides.rb +0 -82
- data/lib/sequel/no_core_ext.rb +0 -4
- data/lib/sequel/plugins/association_autoreloading.rb +0 -11
- data/lib/sequel/plugins/identifier_columns.rb +0 -49
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -11
- data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -90
- data/lib/sequel/plugins/prepared_statements_associations.rb +0 -137
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -71
- data/lib/sequel/plugins/schema.rb +0 -84
- data/lib/sequel/plugins/scissors.rb +0 -37
- data/spec/core/dataset_mutation_spec.rb +0 -253
- data/spec/extensions/_deprecated_identifier_mangling_spec.rb +0 -314
- data/spec/extensions/before_after_save_spec.rb +0 -40
- data/spec/extensions/filter_having_spec.rb +0 -42
- data/spec/extensions/from_block_spec.rb +0 -21
- data/spec/extensions/hash_aliases_spec.rb +0 -26
- data/spec/extensions/identifier_columns_spec.rb +0 -19
- data/spec/extensions/meta_def_spec.rb +0 -35
- data/spec/extensions/no_auto_literal_strings_spec.rb +0 -69
- data/spec/extensions/pg_typecast_on_load_spec.rb +0 -70
- data/spec/extensions/prepared_statements_associations_spec.rb +0 -212
- data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -40
- data/spec/extensions/query_literals_spec.rb +0 -185
- data/spec/extensions/schema_spec.rb +0 -123
- data/spec/extensions/scissors_spec.rb +0 -27
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -118
- data/spec/extensions/set_overrides_spec.rb +0 -75
data/doc/bin_sequel.rdoc
CHANGED
@@ -10,9 +10,7 @@ This is very useful for quick testing of ideas, and does not affect the environm
|
|
10
10
|
|
11
11
|
If you've installed the sequel gem, then just running "sequel" should load the program, since rubygems should place the sequel binary in your load path. However, if you want to run bin/sequel from the root of a repository checkout, you should probably do:
|
12
12
|
|
13
|
-
ruby
|
14
|
-
|
15
|
-
The -I lib makes sure that you are using the repository checkout's code.
|
13
|
+
ruby bin/sequel
|
16
14
|
|
17
15
|
== Choosing the Database to Connect to
|
18
16
|
|
@@ -91,6 +89,8 @@ To save this information to a file, use a standard shell redirection:
|
|
91
89
|
|
92
90
|
The -d option dumps the migration in database-independent format, the -D option dumps it in database-specific format.
|
93
91
|
|
92
|
+
Note that the support for dumping schema is fairly limited. It doesn't handle database views, functions, triggers, schemas, partial indexes, functional indexes, and many other things. You should probably use the database specific tools to handle those.
|
93
|
+
|
94
94
|
The -S option dumps the schema cache for all tables in the database, which can speed up the usage of Sequel with models when using the schema_caching extension. You should provide this option with the path to which to dump the schema:
|
95
95
|
|
96
96
|
sequel -S /path/to/schema_cache.db postgres://host/database
|
@@ -103,6 +103,8 @@ Using the -C option, Sequel can copy the contents of one database to another, ev
|
|
103
103
|
|
104
104
|
This copies the table structure, table data, indexes, and foreign keys from the MySQL database to the PostgreSQL database.
|
105
105
|
|
106
|
+
Note that the support for copying is fairly limited. It doesn't handle database views, functions, triggers, schemas, partial indexes, functional indexes, and many other things. Also, the data type conversion may not be exactly what you want. It is best designed for quick conversions and testing. For serious production use, use the database's tools to copy databases for the same database type, and for different database types, use the Sequel API.
|
107
|
+
|
106
108
|
== Other Options
|
107
109
|
|
108
110
|
Other options not mentioned above are explained briefly here.
|
data/doc/cheat_sheet.rdoc
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
|
7
7
|
DB = Sequel.sqlite('my_blog.db')
|
8
8
|
DB = Sequel.connect('postgres://user:password@localhost/my_db')
|
9
|
-
DB = Sequel.postgres('my_db', :
|
9
|
+
DB = Sequel.postgres('my_db', user: 'user', password: 'password', host: 'localhost')
|
10
10
|
DB = Sequel.ado('mydb')
|
11
11
|
|
12
12
|
== Open an SQLite memory database
|
@@ -18,7 +18,7 @@ Without a filename argument, the sqlite adapter will setup a new sqlite database
|
|
18
18
|
== Logging SQL statements
|
19
19
|
|
20
20
|
require 'logger'
|
21
|
-
DB = Sequel.sqlite
|
21
|
+
DB = Sequel.sqlite(loggers: [Logger.new($stdout)])
|
22
22
|
# or
|
23
23
|
DB.loggers << Logger.new($stdout)
|
24
24
|
|
@@ -38,11 +38,11 @@ Without a filename argument, the sqlite adapter will setup a new sqlite database
|
|
38
38
|
|
39
39
|
== Most dataset methods are chainable
|
40
40
|
|
41
|
-
dataset = DB[:managers].where(:
|
41
|
+
dataset = DB[:managers].where(salary: 5000..10000).order(:name, :department)
|
42
42
|
|
43
43
|
== Insert rows
|
44
44
|
|
45
|
-
dataset.insert(:
|
45
|
+
dataset.insert(name: 'Sharon', grade: 50)
|
46
46
|
|
47
47
|
== Retrieve rows
|
48
48
|
|
@@ -53,7 +53,7 @@ Without a filename argument, the sqlite adapter will setup a new sqlite database
|
|
53
53
|
== Update/Delete rows
|
54
54
|
|
55
55
|
dataset.exclude(:active).delete
|
56
|
-
dataset.where
|
56
|
+
dataset.where{price < 100}.update(:active => true)
|
57
57
|
|
58
58
|
== Datasets are Enumerable
|
59
59
|
|
@@ -67,8 +67,7 @@ Without a filename argument, the sqlite adapter will setup a new sqlite database
|
|
67
67
|
|
68
68
|
=== Equality
|
69
69
|
|
70
|
-
dataset.where(:
|
71
|
-
dataset.where('name = ?', 'abc')
|
70
|
+
dataset.where(name: 'abc')
|
72
71
|
|
73
72
|
=== Inequality
|
74
73
|
|
@@ -77,30 +76,27 @@ Without a filename argument, the sqlite adapter will setup a new sqlite database
|
|
77
76
|
|
78
77
|
=== Inclusion
|
79
78
|
|
80
|
-
dataset.where(:
|
79
|
+
dataset.where(value: 50..100)
|
81
80
|
dataset.where{(value >= 50) & (value <= 100)}
|
82
81
|
|
83
|
-
dataset.where(
|
84
|
-
dataset.where(:
|
85
|
-
|
86
|
-
dataset.where(:id=>other_dataset.select(:other_id))
|
82
|
+
dataset.where(value: [50,75,100])
|
83
|
+
dataset.where(id: other_dataset.select(:other_id))
|
87
84
|
|
88
85
|
=== Subselects as scalar values
|
89
86
|
|
90
|
-
dataset.where('price > (SELECT avg(price) + 100 FROM table)')
|
91
87
|
dataset.where{price > dataset.select(avg(price) + 100)}
|
92
88
|
|
93
89
|
=== LIKE/Regexp
|
94
90
|
|
95
91
|
DB[:items].where(Sequel.like(:name, 'AL%'))
|
96
|
-
DB[:items].where(:
|
92
|
+
DB[:items].where(name: /^AL/)
|
97
93
|
|
98
94
|
=== AND/OR/NOT
|
99
95
|
|
100
96
|
DB[:items].where{(x > 5) & (y > 10)}.sql
|
101
97
|
# SELECT * FROM items WHERE ((x > 5) AND (y > 10))
|
102
98
|
|
103
|
-
DB[:items].where(Sequel.or(:
|
99
|
+
DB[:items].where(Sequel.or(x: 1, y: 2) & Sequel.~(z: 3)).sql
|
104
100
|
# SELECT * FROM items WHERE (((x = 1) OR (y = 2)) AND (z != 3))
|
105
101
|
|
106
102
|
=== Mathematical operators
|
@@ -111,6 +107,13 @@ Without a filename argument, the sqlite adapter will setup a new sqlite database
|
|
111
107
|
DB[:items].where{price - 100 < avg(price)}.sql
|
112
108
|
# SELECT * FROM items WHERE ((price - 100) < avg(price))
|
113
109
|
|
110
|
+
=== Raw SQL Fragments
|
111
|
+
|
112
|
+
dataset.where(Sequel.lit('id= 1'))
|
113
|
+
dataset.where(Sequel.lit('name = ?', 'abc'))
|
114
|
+
dataset.where(Sequel.lit('value IN ?', [50,75,100]))
|
115
|
+
dataset.where(Sequel.lit('price > (SELECT avg(price) + 100 FROM table)'))
|
116
|
+
|
114
117
|
== Ordering
|
115
118
|
|
116
119
|
dataset.order(:kind) # kind
|
@@ -125,11 +128,12 @@ Without a filename argument, the sqlite adapter will setup a new sqlite database
|
|
125
128
|
|
126
129
|
== Joins
|
127
130
|
|
128
|
-
DB[:items].left_outer_join(:categories, :
|
131
|
+
DB[:items].left_outer_join(:categories, id: :category_id).sql
|
129
132
|
# SELECT * FROM items
|
130
133
|
# LEFT OUTER JOIN categories ON categories.id = items.category_id
|
131
134
|
|
132
|
-
DB[:items].join(:categories, :
|
135
|
+
DB[:items].join(:categories, id: :category_id).
|
136
|
+
join(:groups, id: Sequel[:items][:group_id])
|
133
137
|
# SELECT * FROM items
|
134
138
|
# INNER JOIN categories ON categories.id = items.category_id
|
135
139
|
# INNER JOIN groups ON groups.id = items.group_id
|
@@ -142,33 +146,34 @@ Without a filename argument, the sqlite adapter will setup a new sqlite database
|
|
142
146
|
dataset.avg(:price)
|
143
147
|
dataset.sum(:stock)
|
144
148
|
|
145
|
-
dataset.group_and_count(:category)
|
149
|
+
dataset.group_and_count(:category).all
|
146
150
|
dataset.select_group(:category).select_append{avg(:price)}
|
147
151
|
|
148
152
|
== SQL Functions / Literals
|
149
153
|
|
150
|
-
dataset.update(:
|
151
|
-
dataset.update(:
|
154
|
+
dataset.update(updated_at: Sequel.function(:NOW))
|
155
|
+
dataset.update(updated_at: Sequel.lit('NOW()'))
|
152
156
|
|
153
|
-
dataset.update(:
|
154
|
-
dataset.update(:
|
157
|
+
dataset.update(updated_at: Sequel.lit("DateValue('1/1/2001')"))
|
158
|
+
dataset.update(updated_at: Sequel.function(:DateValue, '1/1/2001'))
|
155
159
|
|
156
160
|
== Schema Manipulation
|
157
161
|
|
158
162
|
DB.create_table :items do
|
159
163
|
primary_key :id
|
160
|
-
String :name, :
|
161
|
-
TrueClass :active, :
|
164
|
+
String :name, unique: true, null: false
|
165
|
+
TrueClass :active, default: true
|
162
166
|
foreign_key :category_id, :categories
|
163
|
-
DateTime :created_at
|
167
|
+
DateTime :created_at, default: Sequel::CURRENT_TIMESTAMP, :index=>true
|
164
168
|
|
165
|
-
index :
|
169
|
+
index [:category_id, :active]
|
166
170
|
end
|
167
171
|
|
168
172
|
DB.drop_table :items
|
169
173
|
|
170
174
|
== Aliasing
|
171
175
|
|
176
|
+
DB[:items].select(Sequel[:name].as(:item_name))
|
172
177
|
DB[:items].select(Sequel.as(:name, :item_name))
|
173
178
|
DB[:items].select{name.as(:item_name)}
|
174
179
|
# SELECT name AS item_name FROM items
|
@@ -179,44 +184,62 @@ Without a filename argument, the sqlite adapter will setup a new sqlite database
|
|
179
184
|
== Transactions
|
180
185
|
|
181
186
|
DB.transaction do
|
182
|
-
|
183
|
-
dataset.insert(:
|
184
|
-
|
187
|
+
# BEGIN
|
188
|
+
dataset.insert(first_name: 'Inigo', last_name: 'Montoya')
|
189
|
+
dataset.insert(first_name: 'Farm', last_name: 'Boy')
|
190
|
+
end
|
191
|
+
# COMMIT
|
192
|
+
|
185
193
|
|
186
|
-
|
194
|
+
Transactions are reentrant:
|
187
195
|
|
188
|
-
DB.transaction do
|
196
|
+
DB.transaction do
|
197
|
+
# BEGIN
|
189
198
|
DB.transaction do
|
190
|
-
dataset
|
199
|
+
dataset.insert(first_name: 'Inigo', last_name: 'Montoya')
|
191
200
|
end
|
192
|
-
end
|
201
|
+
end
|
202
|
+
# COMMIT
|
193
203
|
|
194
204
|
Transactions are aborted if an error is raised:
|
195
205
|
|
196
206
|
DB.transaction do
|
207
|
+
# BEGIN
|
197
208
|
raise "some error occurred"
|
198
|
-
end
|
209
|
+
end
|
210
|
+
# ROLLBACK issued and the error is re-raised
|
199
211
|
|
200
212
|
Transactions can also be aborted by raising Sequel::Rollback:
|
201
213
|
|
202
214
|
DB.transaction do
|
203
|
-
|
204
|
-
|
215
|
+
# BEGIN
|
216
|
+
raise(Sequel::Rollback)
|
217
|
+
end
|
218
|
+
# ROLLBACK issued and no error raised
|
205
219
|
|
206
220
|
Savepoints can be used if the database supports it:
|
207
221
|
|
208
222
|
DB.transaction do
|
209
|
-
dataset
|
210
|
-
DB.transaction(:
|
211
|
-
dataset
|
212
|
-
raise(Sequel::Rollback)
|
223
|
+
dataset.insert(first_name: 'Farm', last_name: 'Boy') # Inserted
|
224
|
+
DB.transaction(savepoint: true) do # This savepoint is rolled back
|
225
|
+
dataset.insert(first_name: 'Inigo', last_name: 'Montoya') # Not inserted
|
226
|
+
raise(Sequel::Rollback)
|
213
227
|
end
|
214
|
-
dataset
|
228
|
+
dataset.insert(first_name: 'Prince', last_name: 'Humperdink') # Inserted
|
215
229
|
end
|
216
230
|
|
217
|
-
==
|
231
|
+
== Retrieving SQL
|
218
232
|
|
219
233
|
dataset.sql # "SELECT * FROM items"
|
234
|
+
dataset.insert_sql(a: 1) # "INSERT INTO items (a) VALUES (1)"
|
235
|
+
dataset.update_sql(a: 1) # "UPDATE items SET a = 1"
|
220
236
|
dataset.delete_sql # "DELETE FROM items"
|
221
|
-
|
237
|
+
|
238
|
+
== Basic introspection
|
239
|
+
|
240
|
+
dataset.columns # => [:id, :name, ...]
|
241
|
+
DB.tables # => [:items, ...]
|
242
|
+
DB.views # => [:new_items, ...]
|
222
243
|
DB.schema(:items) # => [[:id, {:type=>:integer, ...}], [:name, {:type=>:string, ...}], ...]
|
244
|
+
DB.indexes(:items) # => {:index_name => {:columns=>[:a], :unique=>false}, ...}
|
245
|
+
DB.foreign_key_list(:items) # => [{:name=>:items_a_fk, :columns=>[:a], :key=>[:id], :table=>:other_table}, ...]
|
data/doc/code_order.rdoc
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
= Code Order
|
2
2
|
|
3
|
-
In Sequel, the order in which code is executed is important. This
|
3
|
+
In Sequel, the order in which code is executed during initialization is important. This
|
4
4
|
guide provides the recommended way to order your Sequel code. Some
|
5
5
|
of these guidelines are not strictly necessary, but others are, and
|
6
6
|
this guide will be specific about which are strictly necessary.
|
@@ -18,13 +18,6 @@ be executed unless the library has been required first. Example:
|
|
18
18
|
Global extensions are loaded with Sequel.extension, and affect
|
19
19
|
other parts of Sequel or the general ruby environment. It's not
|
20
20
|
necessary to load them first, but it is a recommended practice.
|
21
|
-
|
22
|
-
The exception to this is global extensions that integrate with
|
23
|
-
Database-specific extensions, where the Database-specific
|
24
|
-
extension should be loaded first (such as some of the pg_*
|
25
|
-
extensions). In those cases, the global extensions should be
|
26
|
-
loaded after the Database-specific extensions.
|
27
|
-
|
28
21
|
Example:
|
29
22
|
|
30
23
|
Sequel.extension :blank
|
data/doc/core_extensions.rdoc
CHANGED
@@ -10,12 +10,18 @@ Historically, Sequel added methods to many of the core classes, and usage of tho
|
|
10
10
|
|
11
11
|
While Sequel never overrode any methods defined by ruby, it is possible that other libraries could define the same methods that Sequel defines, which could cause problems. Also, some rubyists do not like using libraries that add methods to the core classes.
|
12
12
|
|
13
|
-
Alternatives for the core extension methods
|
13
|
+
Alternatives for the core extension methods were added to Sequel, so the query above could be written as:
|
14
14
|
|
15
15
|
DB[:table].select(Sequel.cast(:column, Integer)).
|
16
16
|
where(Sequel.like(:column, 'A%')).
|
17
17
|
order(Sequel.case({1=>2}, 0, :a))
|
18
18
|
|
19
|
+
or with virtual rows:
|
20
|
+
|
21
|
+
DB[:table].select{column.as(Integer)}.
|
22
|
+
where{column.like('A%')}.
|
23
|
+
order(Sequel.case({1=>2}, 0, :a))
|
24
|
+
|
19
25
|
Almost all of the core extension methods have a replacement on the Sequel module. So it is now up to the user which style to use. Using the methods on the Sequel module results in slightly more verbose code, but allows the code to work without modifications to the core classes.
|
20
26
|
|
21
27
|
== Issues
|
@@ -63,8 +69,9 @@ Symbol#as and String#as return Sequel aliased expressions using the provided ali
|
|
63
69
|
:a.as(:b) # SQL: a AS b
|
64
70
|
'a'.as(:b) # SQL: 'a' AS b
|
65
71
|
|
66
|
-
|
72
|
+
Alternatives:
|
67
73
|
|
74
|
+
Sequel[:a].as(:b)
|
68
75
|
Sequel.as(:a, :b)
|
69
76
|
|
70
77
|
==== cast
|
@@ -74,8 +81,9 @@ Symbol#cast and String#cast return Sequel cast expressions for typecasting in th
|
|
74
81
|
:a.cast(Integer) # SQL: CAST(a AS integer)
|
75
82
|
'a'.cast(Integer) # SQL: CAST('a' AS integer)
|
76
83
|
|
77
|
-
|
84
|
+
Alternatives:
|
78
85
|
|
86
|
+
Sequel[:a].cast(Integer)
|
79
87
|
Sequel.cast(:a, Integer)
|
80
88
|
|
81
89
|
==== cast_numeric
|
@@ -85,8 +93,9 @@ Symbol#cast_numeric and String#cast_numeric return Sequel cast expressions for t
|
|
85
93
|
:a.cast_numeric # SQL: CAST(a AS integer)
|
86
94
|
'a'.cast_numeric(Float) # SQL: CAST('a' AS double precision)
|
87
95
|
|
88
|
-
Alternative:
|
96
|
+
Alternative:
|
89
97
|
|
98
|
+
Sequel[:a].cast_numeric
|
90
99
|
Sequel.cast_numeric(:a)
|
91
100
|
|
92
101
|
==== cast_string
|
@@ -96,21 +105,23 @@ Symbol#cast_string and String#cast_string return Sequel cast expressions for typ
|
|
96
105
|
:a.cast_string # SQL: CAST(a AS varchar(255))
|
97
106
|
'a'.cast_string(:text) # SQL: CAST('a' AS text)
|
98
107
|
|
99
|
-
|
108
|
+
Alternatives:
|
100
109
|
|
110
|
+
Sequel[:a].cast_string
|
101
111
|
Sequel.cast_string(:a)
|
102
112
|
|
103
113
|
=== Symbol
|
104
114
|
|
105
115
|
==== identifier
|
106
116
|
|
107
|
-
Symbol#identifier wraps the symbol in
|
117
|
+
Symbol#identifier wraps the symbol in an Sequel identifier object. If symbol splitting is enabled (no longer the default), it also makes sure the symbol will not be split. If symbol splitting is disabled (the default), there is little reason to use this).
|
108
118
|
|
109
|
-
:
|
119
|
+
:column.identifier # SQL: column
|
110
120
|
|
111
|
-
|
121
|
+
Alternatives:
|
112
122
|
|
113
|
-
Sequel
|
123
|
+
Sequel[:column]
|
124
|
+
Sequel.identifier(:column)
|
114
125
|
|
115
126
|
==== asc
|
116
127
|
|
@@ -118,8 +129,9 @@ Symbol#asc is used to define an ascending order on a column. It exists mostly f
|
|
118
129
|
|
119
130
|
:a.asc # SQL: a ASC
|
120
131
|
|
121
|
-
|
132
|
+
Alternatives:
|
122
133
|
|
134
|
+
Sequel[:a].asc
|
123
135
|
Sequel.asc(:a)
|
124
136
|
|
125
137
|
==== desc
|
@@ -128,8 +140,9 @@ Symbol#desc is used to defined a descending order on a column. The returned val
|
|
128
140
|
|
129
141
|
:a.desc # SQL: a DESC
|
130
142
|
|
131
|
-
|
143
|
+
Alternatives:
|
132
144
|
|
145
|
+
Sequel[:a].desc
|
133
146
|
Sequel.desc(:a)
|
134
147
|
|
135
148
|
==== +, -, *, /
|
@@ -148,6 +161,12 @@ Sequel also supports ruby's coercion protocols on symbols (note that this does n
|
|
148
161
|
|
149
162
|
Alternatives:
|
150
163
|
|
164
|
+
Sequel[:a] + :b
|
165
|
+
Sequel[:a] - :b
|
166
|
+
Sequel[:a] * :b
|
167
|
+
Sequel[:a] / :b
|
168
|
+
Sequel[:a] ** :b
|
169
|
+
|
151
170
|
Sequel.+(:a, :b)
|
152
171
|
Sequel.-(:a, :b)
|
153
172
|
Sequel.*(:a, :b)
|
@@ -160,7 +179,7 @@ The * operator is overloaded on Symbol such that if it is called with no argumen
|
|
160
179
|
|
161
180
|
:a.* # SQL: a.*
|
162
181
|
|
163
|
-
Alternative:
|
182
|
+
Alternative:
|
164
183
|
|
165
184
|
Sequel[:a].*
|
166
185
|
|
@@ -170,7 +189,7 @@ Symbol#qualify qualifies the identifier (e.g. a column) with a another identifie
|
|
170
189
|
|
171
190
|
:column.qualify(:table) # SQL: table.column
|
172
191
|
|
173
|
-
Alternative:
|
192
|
+
Alternative:
|
174
193
|
|
175
194
|
Sequel[:table][:column]
|
176
195
|
|
@@ -182,8 +201,9 @@ Symbol#like returns a case sensitive LIKE expression between the identifier and
|
|
182
201
|
|
183
202
|
:a.like('b%') # SQL: a LIKE 'b%' ESCAPE '\'
|
184
203
|
|
185
|
-
|
204
|
+
Alternatives:
|
186
205
|
|
206
|
+
Sequel[:a].like('b%')
|
187
207
|
Sequel.like(:a, 'b%')
|
188
208
|
|
189
209
|
==== ilike
|
@@ -192,8 +212,9 @@ Symbol#ilike returns a case insensitive LIKE expression between the identifier a
|
|
192
212
|
|
193
213
|
:a.ilike('b%') # SQL: a ILIKE 'b%' ESCAPE '\'
|
194
214
|
|
195
|
-
|
215
|
+
Alternatives:
|
196
216
|
|
217
|
+
Sequel[:a].ilike('b%')
|
197
218
|
Sequel.ilike(:a, 'b%')
|
198
219
|
|
199
220
|
==== sql_subscript
|
@@ -202,8 +223,9 @@ Symbol#sql_subscript returns a Sequel expression representing an SQL array acces
|
|
202
223
|
|
203
224
|
:a.sql_subscript(1) # SQL: a[1]
|
204
225
|
|
205
|
-
|
226
|
+
Alternatives:
|
206
227
|
|
228
|
+
Sequel[:a].sql_subscript(1)
|
207
229
|
Sequel.subscript(:a, 1)
|
208
230
|
|
209
231
|
==== extract
|
@@ -212,12 +234,11 @@ Symbol#extract does a datetime part extraction from the receiver:
|
|
212
234
|
|
213
235
|
:a.extract(:year) # SQL: extract(year FROM a)
|
214
236
|
|
215
|
-
|
237
|
+
Alternatives:
|
216
238
|
|
239
|
+
Sequel[:a].extract(:year)
|
217
240
|
Sequel.extract(:year, :a)
|
218
241
|
|
219
|
-
Note the reversed order of the arguments. In Symbol#extract, the datetime part is the argument, while in Sequel.extract, the datetime part is the first argument.
|
220
|
-
|
221
242
|
==== sql_boolean, sql_number, sql_string
|
222
243
|
|
223
244
|
These Symbol methods are used to force the treating of the object as a specific SQL type, instead of as a general SQL type. For example:
|
@@ -226,7 +247,7 @@ These Symbol methods are used to force the treating of the object as a specific
|
|
226
247
|
:a.sql_number << 1 # SQL: a << 1
|
227
248
|
:a.sql_string + 'a' # SQL: a || 'a'
|
228
249
|
|
229
|
-
|
250
|
+
Alternatives:
|
230
251
|
|
231
252
|
Sequel[:a].sql_boolean
|
232
253
|
Sequel[:a].sql_number
|
@@ -240,8 +261,9 @@ Symbol#sql_function returns an SQL function call expression object:
|
|
240
261
|
:sum.sql_function(:a) # SQL: sum(a)
|
241
262
|
:concat.sql_function(:a, :b) # SQL: concat(a, b)
|
242
263
|
|
243
|
-
|
264
|
+
Alternatives:
|
244
265
|
|
266
|
+
Sequel[:sum].function(:a)
|
245
267
|
Sequel.function(:sum, :a)
|
246
268
|
|
247
269
|
=== String
|
@@ -253,9 +275,10 @@ String#lit creates a literal string, using placeholders if any arguments are giv
|
|
253
275
|
'a'.lit # SQL: a
|
254
276
|
'"a" = ?'.lit(1) # SQL: "a" = 1
|
255
277
|
|
256
|
-
|
278
|
+
Alternatives:
|
257
279
|
|
258
280
|
Sequel.lit('a')
|
281
|
+
Sequel.lit('a = ?', 1)
|
259
282
|
|
260
283
|
==== to_sequel_blob
|
261
284
|
|
@@ -263,7 +286,7 @@ String#to_sequel_blob returns the string wrapper in Sequel blob object. Often b
|
|
263
286
|
|
264
287
|
"a\0".to_sequel_blob # SQL: X'6100'
|
265
288
|
|
266
|
-
Alternative:
|
289
|
+
Alternative:
|
267
290
|
|
268
291
|
Sequel.blob("a\0")
|
269
292
|
|
@@ -273,12 +296,13 @@ Alternative: Sequel.blob:
|
|
273
296
|
|
274
297
|
Array#~, Hash#~, and Symbol#~ treat the receiver as a conditions specifier, not matching all of the conditions:
|
275
298
|
|
276
|
-
~{:
|
299
|
+
~{a: 1, b: [2, 3]} # SQL: a != 1 OR b NOT IN (2, 3)
|
277
300
|
~[[:a, 1], [:b, [1, 2]]] # SQL: a != 1 OR b NOT IN (1, 2)
|
278
301
|
|
279
|
-
|
302
|
+
Alternatives:
|
280
303
|
|
281
|
-
Sequel
|
304
|
+
~Sequel[a: 1, b: [2, 3]]
|
305
|
+
Sequel.~(a: 1, b: [2, 3])
|
282
306
|
|
283
307
|
=== Hash & Array
|
284
308
|
|
@@ -286,45 +310,45 @@ Alternative: Sequel.~:
|
|
286
310
|
|
287
311
|
Array#case and Hash#case return an SQL CASE expression, where the keys are conditions and the values are results:
|
288
312
|
|
289
|
-
{{:
|
290
|
-
[[{:
|
313
|
+
{{a: [2,3]} => 1}.case(0) # SQL: CASE WHEN a IN (2, 3) THEN 1 ELSE 0 END
|
314
|
+
[[{a: [2,3]}, 1]].case(0) # SQL: CASE WHEN a IN (2, 3) THEN 1 ELSE 0 END
|
291
315
|
|
292
|
-
Alternative:
|
316
|
+
Alternative:
|
293
317
|
|
294
|
-
Sequel.case({{:
|
318
|
+
Sequel.case({{a: [2,3]}=>1}, 0)
|
295
319
|
|
296
320
|
==== sql_expr
|
297
321
|
|
298
322
|
Array#sql_expr and Hash#sql_expr treat the receiver as a conditions specifier, matching all of the conditions in the array.
|
299
323
|
|
300
|
-
{:
|
324
|
+
{a: 1, b: [2, 3]}.sql_expr # SQL: a = 1 AND b IN (2, 3)
|
301
325
|
[[:a, 1], [:b, [2, 3]]].sql_expr # SQL: a = 1 AND b IN (2, 3)
|
302
326
|
|
303
|
-
Alternative:
|
327
|
+
Alternative:
|
304
328
|
|
305
|
-
Sequel[:
|
329
|
+
Sequel[a: 1, b: [2, 3]]
|
306
330
|
|
307
331
|
==== sql_negate
|
308
332
|
|
309
333
|
Array#sql_negate and Hash#sql_negate treat the receiver as a conditions specifier, matching none of the conditions in the array:
|
310
334
|
|
311
|
-
{:
|
335
|
+
{a: 1, b: [2, 3]}.sql_negate # SQL: a != 1 AND b NOT IN (2, 3)
|
312
336
|
[[:a, 1], [:b, [2, 3]]].sql_negate # SQL: a != 1 AND b NOT IN (2, 3)
|
313
337
|
|
314
|
-
Alternative:
|
338
|
+
Alternative:
|
315
339
|
|
316
|
-
Sequel.negate(:
|
340
|
+
Sequel.negate(a: 1, b: [2, 3])
|
317
341
|
|
318
342
|
==== sql_or
|
319
343
|
|
320
344
|
Array#sql_or nd Hash#sql_or treat the receiver as a conditions specifier, matching any of the conditions in the array:
|
321
345
|
|
322
|
-
{:
|
346
|
+
{a: 1, b: [2, 3]}.sql_or # SQL: a = 1 OR b IN (2, 3)
|
323
347
|
[[:a, 1], [:b, [2, 3]]].sql_or # SQL: a = 1 OR b IN (2, 3)
|
324
348
|
|
325
|
-
Alternative:
|
349
|
+
Alternative:
|
326
350
|
|
327
|
-
Sequel.or(:
|
351
|
+
Sequel.or(a: 1, b: [2, 3])
|
328
352
|
|
329
353
|
=== Array
|
330
354
|
|
@@ -332,10 +356,10 @@ Alternative: Sequel.or:
|
|
332
356
|
|
333
357
|
Array#sql_value_list wraps the array in an array subclass, which Sequel will always treat as a value list and not a conditions specifier. By default, Sequel treats arrays of two element arrays as a conditions specifier.
|
334
358
|
|
335
|
-
DB[:a].where('(a, b) IN ?', [[1, 2], [3, 4]])
|
359
|
+
DB[:a].where('(a, b) IN ?', [[1, 2], [3, 4]]) # SQL: (a, b) IN ((1 = 2) AND (3 = 4))
|
336
360
|
DB[:a].where('(a, b) IN ?', [[1, 2], [3, 4]].sql_value_list) # SQL: (a, b) IN ((1, 2), (3, 4))
|
337
361
|
|
338
|
-
Alternative:
|
362
|
+
Alternative:
|
339
363
|
|
340
364
|
Sequel.value_list([[1, 2], [3, 4]])
|
341
365
|
|
@@ -343,12 +367,12 @@ Alternative: Sequel.value_list:
|
|
343
367
|
|
344
368
|
Array#sql_string_join joins all of the elements in the array in an SQL string concatentation expression:
|
345
369
|
|
346
|
-
[:a].sql_string_join
|
347
|
-
[:a, :b].sql_string_join
|
348
|
-
[:a, 'b'].sql_string_join
|
370
|
+
[:a].sql_string_join # SQL: a
|
371
|
+
[:a, :b].sql_string_join # SQL: a || b
|
372
|
+
[:a, 'b'].sql_string_join # SQL: a || 'b'
|
349
373
|
['a', :b].sql_string_join(' ') # SQL: 'a' || ' ' || b
|
350
374
|
|
351
|
-
Alternative:
|
375
|
+
Alternative:
|
352
376
|
|
353
377
|
Sequel.join(['a', :b], ' ')
|
354
378
|
|
@@ -358,23 +382,24 @@ Alternative: Sequel.join:
|
|
358
382
|
|
359
383
|
Hash#& and Symbol#& return a Sequel boolean expression, matching the condition specified by the receiver and the condition specified by the given argument:
|
360
384
|
|
361
|
-
:a & :b
|
362
|
-
{:
|
363
|
-
{:
|
385
|
+
:a & :b # SQL: a AND b
|
386
|
+
{a: 1} & :b # SQL: a = 1 AND b
|
387
|
+
{a: true} & :b # SQL: a IS TRUE AND b
|
364
388
|
|
365
|
-
|
389
|
+
Alternatives:
|
366
390
|
|
367
|
-
Sequel
|
391
|
+
Sequel[a: 1] & :b
|
392
|
+
Sequel.&({a: 1}, :b)
|
368
393
|
|
369
394
|
==== |
|
370
395
|
|
371
396
|
Hash#| returns a Sequel boolean expression, matching the condition specified by the receiver or the condition specified by the given argument:
|
372
397
|
|
373
|
-
:a | :b
|
374
|
-
{:
|
375
|
-
{:
|
376
|
-
|
377
|
-
Alternative: Sequel.|:
|
398
|
+
:a | :b # SQL: a OR b
|
399
|
+
{a: 1} | :b # SQL: a = 1 OR b
|
400
|
+
{a: true} | :b # SQL: a IS TRUE OR b
|
378
401
|
|
379
|
-
|
402
|
+
Alternative:
|
380
403
|
|
404
|
+
Sequel[a: 1] | :b
|
405
|
+
Sequel.|({a: 1}, :b)
|