sequel 4.49.0 → 5.3.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 +130 -0
- data/README.rdoc +195 -136
- data/Rakefile +26 -42
- data/bin/sequel +6 -9
- data/doc/advanced_associations.rdoc +91 -168
- 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/release_notes/5.1.0.txt +31 -0
- data/doc/release_notes/5.2.0.txt +33 -0
- data/doc/release_notes/5.3.0.txt +121 -0
- data/doc/schema_modification.rdoc +78 -64
- data/doc/security.rdoc +97 -88
- data/doc/sharding.rdoc +43 -30
- data/doc/sql.rdoc +53 -65
- data/doc/testing.rdoc +4 -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/adapters/ado/access.rb +7 -13
- data/lib/sequel/adapters/ado/mssql.rb +2 -9
- data/lib/sequel/adapters/ado.rb +9 -25
- data/lib/sequel/adapters/amalgalite.rb +3 -18
- data/lib/sequel/adapters/ibmdb.rb +9 -45
- 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 +6 -26
- data/lib/sequel/adapters/jdbc/hsqldb.rb +2 -27
- 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 +11 -15
- data/lib/sequel/adapters/jdbc/oracle.rb +4 -26
- data/lib/sequel/adapters/jdbc/postgresql.rb +23 -33
- 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/jdbc.rb +18 -74
- 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/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/odbc.rb +0 -19
- data/lib/sequel/adapters/oracle.rb +8 -13
- data/lib/sequel/adapters/postgres.rb +28 -150
- 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 +61 -227
- data/lib/sequel/adapters/shared/oracle.rb +13 -41
- data/lib/sequel/adapters/shared/postgres.rb +58 -264
- data/lib/sequel/adapters/shared/sqlanywhere.rb +4 -96
- data/lib/sequel/adapters/shared/sqlite.rb +22 -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 +4 -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/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/connection_pool.rb +38 -28
- data/lib/sequel/core.rb +42 -101
- 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 +36 -55
- data/lib/sequel/database/query.rb +8 -13
- data/lib/sequel/database/schema_generator.rb +93 -64
- data/lib/sequel/database/schema_methods.rb +61 -79
- data/lib/sequel/database/transactions.rb +4 -24
- data/lib/sequel/database.rb +12 -2
- data/lib/sequel/dataset/actions.rb +57 -107
- data/lib/sequel/dataset/dataset_module.rb +4 -16
- data/lib/sequel/dataset/features.rb +35 -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 +91 -161
- data/lib/sequel/dataset/sql.rb +33 -225
- data/lib/sequel/dataset.rb +18 -10
- 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 +27 -43
- 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_extended_date_support.rb +230 -0
- 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 +3 -16
- 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/extensions/synchronize_sql.rb +45 -0
- data/lib/sequel/model/associations.rb +129 -131
- data/lib/sequel/model/base.rb +133 -731
- 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/model.rb +27 -62
- 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 -23
- data/lib/sequel/version.rb +2 -2
- data/lib/sequel.rb +1 -1
- 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 +111 -478
- data/spec/adapters/oracle_spec.rb +1 -9
- data/spec/adapters/postgres_spec.rb +459 -664
- 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 +96 -244
- data/spec/core/dataset_spec.rb +99 -414
- data/spec/core/deprecated_spec.rb +3 -3
- data/spec/core/expression_filters_spec.rb +37 -144
- data/spec/core/mock_adapter_spec.rb +241 -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 +88 -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 +30 -92
- 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 +53 -1118
- 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 +8 -30
- 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 +5 -6
- data/spec/extensions/looser_typecasting_spec.rb +1 -1
- data/spec/extensions/many_through_many_spec.rb +25 -33
- data/spec/extensions/migration_spec.rb +12 -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 +2 -2
- data/spec/extensions/pagination_spec.rb +1 -1
- data/spec/extensions/pg_array_associations_spec.rb +22 -26
- 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_extended_date_support_spec.rb +122 -0
- data/spec/extensions/pg_hstore_ops_spec.rb +1 -1
- data/spec/extensions/pg_hstore_spec.rb +22 -31
- 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 +7 -7
- data/spec/extensions/prepared_statements_spec.rb +13 -48
- data/spec/extensions/pretty_table_spec.rb +40 -9
- data/spec/extensions/query_spec.rb +1 -12
- data/spec/extensions/rcte_tree_spec.rb +23 -34
- 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 +43 -32
- 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 +5 -17
- 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/synchronize_sql_spec.rb +124 -0
- 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 +5 -7
- 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 +12 -16
- 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 -13
- 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 +8 -13
- 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 +12 -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 +7 -23
- data/spec/integration/prepared_statement_test.rb +8 -88
- data/spec/integration/schema_test.rb +10 -10
- data/spec/integration/spec_helper.rb +17 -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 +43 -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 +48 -17
- data/spec/model/hooks_spec.rb +5 -300
- data/spec/model/inflector_spec.rb +1 -1
- data/spec/model/model_spec.rb +29 -339
- data/spec/model/plugins_spec.rb +2 -16
- data/spec/model/record_spec.rb +33 -129
- data/spec/model/spec_helper.rb +5 -15
- data/spec/model/validations_spec.rb +1 -1
- data/spec/sequel_warning.rb +1 -12
- metadata +19 -65
- data/doc/active_record.rdoc +0 -927
- data/lib/sequel/adapters/cubrid.rb +0 -160
- 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/do.rb +0 -166
- 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/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/swift.rb +0 -169
- 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/postgresql.rdoc
CHANGED
|
@@ -19,10 +19,10 @@ rarely used PostgreSQL features that Sequel supports which are not mentioned her
|
|
|
19
19
|
|
|
20
20
|
Some of this this support depends on the specific adapter or underlying driver in use.
|
|
21
21
|
<tt>postgres only</tt> will denote support specific to the postgres adapter (i.e.
|
|
22
|
-
not available when connecting to PostgreSQL via the jdbc
|
|
22
|
+
not available when connecting to PostgreSQL via the jdbc adapter).
|
|
23
23
|
<tt>postgres/pg only</tt> will denote support specific to the postgres adapter when
|
|
24
|
-
pg is used as the underlying driver (i.e. not available when using the postgres-pr
|
|
25
|
-
|
|
24
|
+
pg is used as the underlying driver (i.e. not available when using the postgres-pr
|
|
25
|
+
driver).
|
|
26
26
|
|
|
27
27
|
== PostgreSQL-specific Database Type Support
|
|
28
28
|
|
|
@@ -44,7 +44,7 @@ pg_range :: ranges (for any scalar type), as a ruby Range-like object
|
|
|
44
44
|
pg_row :: row-valued/composite types, as a ruby Hash-like or Sequel::Model object
|
|
45
45
|
|
|
46
46
|
In general, these extensions just add support for Database objects to return retrieved
|
|
47
|
-
column values as the appropriate type
|
|
47
|
+
column values as the appropriate type and support for literalizing
|
|
48
48
|
the objects correctly for use in an SQL string, or using them as bound variable values (<tt>postgres/pg and jdbc/postgres only</tt>).
|
|
49
49
|
|
|
50
50
|
There are also type-specific extensions that make it easy to use database functions
|
|
@@ -56,6 +56,13 @@ pg_json_ops :: json-related functions and operators
|
|
|
56
56
|
pg_range_ops :: range-related functions and operators
|
|
57
57
|
pg_row_ops :: row-valued/composite type syntax support
|
|
58
58
|
|
|
59
|
+
These extensions aren't Database specific, they are global extensions, so you should
|
|
60
|
+
load them via <tt>Sequel.extension</tt>, after loading support for the specific types
|
|
61
|
+
into the Database instance:
|
|
62
|
+
|
|
63
|
+
DB.extension :pg_array
|
|
64
|
+
Sequel.extension :pg_array_ops
|
|
65
|
+
|
|
59
66
|
== PostgreSQL-specific DDL Support
|
|
60
67
|
|
|
61
68
|
=== Exclusion Constraints
|
|
@@ -64,7 +71,7 @@ In +create_table+ blocks, you can use the +exclude+ method to set up exclusion c
|
|
|
64
71
|
|
|
65
72
|
DB.create_table(:table) do
|
|
66
73
|
daterange :during
|
|
67
|
-
exclude([[:during, '&&']], :
|
|
74
|
+
exclude([[:during, '&&']], name: :table_during_excl)
|
|
68
75
|
end
|
|
69
76
|
# CREATE TABLE "table" ("during" daterange,
|
|
70
77
|
# CONSTRAINT "table_during_excl" EXCLUDE USING gist ("during" WITH &&))
|
|
@@ -72,20 +79,20 @@ In +create_table+ blocks, you can use the +exclude+ method to set up exclusion c
|
|
|
72
79
|
You can also add exclusion constraints in +alter_table+ blocks using add_exclusion_constraint:
|
|
73
80
|
|
|
74
81
|
DB.alter_table(:table) do
|
|
75
|
-
add_exclusion_constraint([[:during, '&&']], :
|
|
82
|
+
add_exclusion_constraint([[:during, '&&']], name: :table_during_excl)
|
|
76
83
|
end
|
|
77
84
|
# ALTER TABLE "table" ADD CONSTRAINT "table_during_excl" EXCLUDE USING gist ("during" WITH &&)
|
|
78
85
|
|
|
79
86
|
=== Adding Foreign Key and Check Constraints Without Initial Validation
|
|
80
87
|
|
|
81
|
-
You can add a <tt
|
|
88
|
+
You can add a <tt>not_valid: true</tt> option when adding constraints to existing tables so
|
|
82
89
|
that it doesn't check if all current rows are valid:
|
|
83
90
|
|
|
84
91
|
DB.alter_table(:table) do
|
|
85
92
|
# Assumes t_id column already exists
|
|
86
|
-
add_foreign_key([:t_id], :table, :
|
|
93
|
+
add_foreign_key([:t_id], :table, not_valid: true, name: :table_fk)
|
|
87
94
|
|
|
88
|
-
constraint({:
|
|
95
|
+
constraint({name: :col_123, not_valid: true}, col: [1,2,3])
|
|
89
96
|
end
|
|
90
97
|
# ALTER TABLE "table" ADD CONSTRAINT "table_fk" FOREIGN KEY ("t_id") REFERENCES "table" NOT VALID
|
|
91
98
|
# ALTER TABLE "table" ADD CONSTRAINT "col_123" CHECK (col IN (1, 2, 3)) NOT VALID
|
|
@@ -102,14 +109,14 @@ all existing rows have been fixed, you can validate the constraint:
|
|
|
102
109
|
|
|
103
110
|
=== Creating Indexes Concurrently
|
|
104
111
|
|
|
105
|
-
You can create indexes concurrently using the <tt
|
|
112
|
+
You can create indexes concurrently using the <tt>concurrently: true</tt> option:
|
|
106
113
|
|
|
107
|
-
DB.add_index(:table, :t_id, :
|
|
114
|
+
DB.add_index(:table, :t_id, concurrently: true)
|
|
108
115
|
# CREATE INDEX CONCURRENTLY "table_t_id_index" ON "table" ("t_id")
|
|
109
116
|
|
|
110
117
|
Similarly, you can drop indexes concurrently as well:
|
|
111
118
|
|
|
112
|
-
DB.drop_index(:table, :t_id, :
|
|
119
|
+
DB.drop_index(:table, :t_id, concurrently: true)
|
|
113
120
|
# DROP INDEX CONCURRENTLY "table_t_id_index"
|
|
114
121
|
|
|
115
122
|
=== Specific Conversions When Altering Column Types
|
|
@@ -119,7 +126,7 @@ conversion via a USING clause, and Sequel supports this using the <tt>:using</tt
|
|
|
119
126
|
|
|
120
127
|
DB.alter_table(:table) do
|
|
121
128
|
# Assume unix_time column is stored as an integer, and you want to change it to timestamp
|
|
122
|
-
set_column_type :unix_time, Time, :
|
|
129
|
+
set_column_type :unix_time, Time, using: (Sequel.cast('epoch', Time) + Sequel.cast('1 second', :interval) * :unix_time)
|
|
123
130
|
end
|
|
124
131
|
# ALTER TABLE "table" ALTER COLUMN "unix_time" TYPE timestamp
|
|
125
132
|
# USING (CAST('epoch' AS timestamp) + (CAST('1 second' AS interval) * "unix_time"))
|
|
@@ -127,9 +134,9 @@ conversion via a USING clause, and Sequel supports this using the <tt>:using</tt
|
|
|
127
134
|
=== Creating Unlogged Tables
|
|
128
135
|
|
|
129
136
|
PostgreSQL allows users to create unlogged tables, which are faster but not crash safe. Sequel
|
|
130
|
-
allows you do create an unlogged table by specifying the <tt
|
|
137
|
+
allows you do create an unlogged table by specifying the <tt>unlogged: true</tt> option to +create_table+:
|
|
131
138
|
|
|
132
|
-
DB.create_table(:table, :
|
|
139
|
+
DB.create_table(:table, unlogged: true){Integer :i}
|
|
133
140
|
# CREATE UNLOGGED TABLE "table" ("i" integer)
|
|
134
141
|
|
|
135
142
|
=== Creating/Dropping Schemas, Languages, Functions, and Triggers
|
|
@@ -146,7 +153,7 @@ Sequel has built in support for creating and dropping PostgreSQL schemas, proced
|
|
|
146
153
|
DB.drop_language(:plperl)
|
|
147
154
|
# DROP LANGUAGE plperl
|
|
148
155
|
|
|
149
|
-
DB.create_function(:set_updated_at, <<-SQL, :
|
|
156
|
+
DB.create_function(:set_updated_at, <<-SQL, language: :plpgsql, returns: :trigger)
|
|
150
157
|
BEGIN
|
|
151
158
|
NEW.updated_at := CURRENT_TIMESTAMP;
|
|
152
159
|
RETURN NEW;
|
|
@@ -160,11 +167,13 @@ Sequel has built in support for creating and dropping PostgreSQL schemas, proced
|
|
|
160
167
|
DB.drop_function(:set_updated_at)
|
|
161
168
|
# DROP FUNCTION set_updated_at()
|
|
162
169
|
|
|
163
|
-
DB.create_trigger(:table, :trg_updated_at, :set_updated_at, :
|
|
170
|
+
DB.create_trigger(:table, :trg_updated_at, :set_updated_at, events: :update, each_row: true, when: {Sequel[:new][:updated_at] => Sequel[:old][:updated_at]})
|
|
164
171
|
# CREATE TRIGGER trg_updated_at BEFORE UPDATE ON "table" FOR EACH ROW WHEN ("new"."updated_at" = "old"."updated_at") EXECUTE PROCEDURE set_updated_at()
|
|
165
172
|
DB.drop_trigger(:table, :trg_updated_at)
|
|
166
173
|
# DROP TRIGGER trg_updated_at ON "table"
|
|
167
174
|
|
|
175
|
+
However, you may want to consider just use <tt>Database#run</tt> with the necessary SQL code, at least for functions and triggers.
|
|
176
|
+
|
|
168
177
|
== PostgreSQL-specific DML Support
|
|
169
178
|
|
|
170
179
|
=== Returning Rows From Insert, Update, and Delete Statements
|
|
@@ -178,12 +187,12 @@ Sequel supports the ability to return rows from insert, update, and delete state
|
|
|
178
187
|
DB[:table].returning(:id).delete
|
|
179
188
|
# DELETE FROM "table" RETURNING "id"
|
|
180
189
|
|
|
181
|
-
DB[:table].returning(:id, Sequel.*(:id, :id).as(:idsq)).update(:
|
|
190
|
+
DB[:table].returning(:id, Sequel.*(:id, :id).as(:idsq)).update(id: 2)
|
|
182
191
|
# UPDATE "table" SET "id" = 2 RETURNING "id", ("id" * "id") AS "idsq"
|
|
183
192
|
|
|
184
193
|
When returning is used, instead of returning the number of rows affected (for updated/delete)
|
|
185
194
|
or the serial primary key value (for insert), it will return an array of hashes with the
|
|
186
|
-
|
|
195
|
+
returning results.
|
|
187
196
|
|
|
188
197
|
=== VALUES Support
|
|
189
198
|
|
|
@@ -203,27 +212,27 @@ Sequel offers support for the +VALUES+ statement using <tt>Database#values</tt>:
|
|
|
203
212
|
Starting with PostgreSQL 9.5, you can do an upsert or ignore unique or exclusion constraint
|
|
204
213
|
violations when inserting using <tt>Dataset#insert_conflict</tt>:
|
|
205
214
|
|
|
206
|
-
DB[:table].insert_conflict.insert(:
|
|
215
|
+
DB[:table].insert_conflict.insert(a: 1, b: 2)
|
|
207
216
|
# INSERT INTO TABLE (a, b) VALUES (1, 2)
|
|
208
217
|
# ON CONFLICT DO NOTHING
|
|
209
218
|
|
|
210
219
|
For compatibility with Sequel's MySQL support, you can also use +insert_ignore+:
|
|
211
220
|
|
|
212
|
-
DB[:table].insert_ignore.insert(:
|
|
221
|
+
DB[:table].insert_ignore.insert(a: 1, b: 2)
|
|
213
222
|
# INSERT INTO TABLE (a, b) VALUES (1, 2)
|
|
214
223
|
# ON CONFLICT DO NOTHING
|
|
215
224
|
|
|
216
225
|
You can pass a specific constraint name using +:constraint+, to only ignore a specific
|
|
217
226
|
constraint violation:
|
|
218
227
|
|
|
219
|
-
DB[:table].insert_conflict(:
|
|
228
|
+
DB[:table].insert_conflict(constraint: :table_a_uidx).insert(a: 1, b: 2)
|
|
220
229
|
# INSERT INTO TABLE (a, b) VALUES (1, 2)
|
|
221
230
|
# ON CONFLICT ON CONSTRAINT table_a_uidx DO NOTHING
|
|
222
231
|
|
|
223
232
|
If the unique or exclusion constraint covers the whole table (e.g. it isn't a partial unique
|
|
224
233
|
index), then you can just specify the column using the +:target+ option:
|
|
225
234
|
|
|
226
|
-
DB[:table].insert_conflict(:
|
|
235
|
+
DB[:table].insert_conflict(target: :a).insert(a: 1, b: 2)
|
|
227
236
|
# INSERT INTO TABLE (a, b) VALUES (1, 2)
|
|
228
237
|
# ON CONFLICT (a) DO NOTHING
|
|
229
238
|
|
|
@@ -231,7 +240,7 @@ If you want to update the existing row instead of ignoring the constraint violat
|
|
|
231
240
|
can pass an +:update+ option with a hash of values to update. You must pass either the
|
|
232
241
|
+:target+ or +:constraint+ options when passing the +:update+ option:
|
|
233
242
|
|
|
234
|
-
DB[:table].insert_conflict(:
|
|
243
|
+
DB[:table].insert_conflict(target: :a, update: {b: Sequel[:excluded][:b]}).insert(a: 1, b: 2)
|
|
235
244
|
# INSERT INTO TABLE (a, b) VALUES (1, 2)
|
|
236
245
|
# ON CONFLICT (a) DO UPDATE SET b = excluded.b
|
|
237
246
|
|
|
@@ -239,8 +248,9 @@ Additionally, if you only want to do the update in certain cases, you can specif
|
|
|
239
248
|
+:update_where+ option, which will be used as a filter. If the row doesn't match the
|
|
240
249
|
conditions, the constraint violation will be ignored, but the row will not be updated:
|
|
241
250
|
|
|
242
|
-
DB[:table].insert_conflict(
|
|
243
|
-
:
|
|
251
|
+
DB[:table].insert_conflict(constraint::table_a_uidx,
|
|
252
|
+
update: {b: Sequel[:excluded][:b]},
|
|
253
|
+
update_where: {Sequel[:table][:status_id]=>1}).insert(a: 1, b: 2)
|
|
244
254
|
# INSERT INTO TABLE (a, b) VALUES (1, 2)
|
|
245
255
|
# ON CONFLICT ON CONSTRAINT table_a_uidx
|
|
246
256
|
# DO UPDATE SET b = excluded.b WHERE (table.status_id = 1)
|
|
@@ -271,19 +281,19 @@ without keeping all rows in memory:
|
|
|
271
281
|
This support is used by default when using <tt>Dataset#paged_each</tt>.
|
|
272
282
|
|
|
273
283
|
Using cursors, it is possible to update individual rows of a large dataset
|
|
274
|
-
easily using the <tt
|
|
284
|
+
easily using the <tt>rows_per_fetch: 1</tt> option in conjunction with
|
|
275
285
|
<tt>Dataset#where_current_of</tt>. This is useful if the logic needed to
|
|
276
286
|
update the rows exists in the application and not in the database:
|
|
277
287
|
|
|
278
|
-
ds.use_cursor(:
|
|
279
|
-
ds.where_current_of.update(:
|
|
288
|
+
ds.use_cursor(rows_per_fetch: 1).each do |row|
|
|
289
|
+
ds.where_current_of.update(col: new_col_value(row))
|
|
280
290
|
end
|
|
281
291
|
|
|
282
292
|
=== Truncate Modifiers
|
|
283
293
|
|
|
284
294
|
Sequel supports PostgreSQL-specific truncate options:
|
|
285
295
|
|
|
286
|
-
DB[:table].truncate(:
|
|
296
|
+
DB[:table].truncate(cascade: true, only: true, restart: true)
|
|
287
297
|
# TRUNCATE TABLE ONLY "table" RESTART IDENTITY CASCADE
|
|
288
298
|
|
|
289
299
|
=== COPY Support <tt>postgres/pg and jdbc/postgres only</tt>
|
|
@@ -292,14 +302,14 @@ PostgreSQL's COPY feature is pretty much the fastest way to get data in or out o
|
|
|
292
302
|
Sequel supports getting data out of the database via <tt>Database#copy_table</tt>, either for
|
|
293
303
|
a specific table or for an arbitrary dataset:
|
|
294
304
|
|
|
295
|
-
DB.copy_table(:table, :
|
|
305
|
+
DB.copy_table(:table, format: :csv)
|
|
296
306
|
# COPY "table" TO STDOUT (FORMAT csv)
|
|
297
|
-
DB.copy_table(DB[:table], :
|
|
307
|
+
DB.copy_table(DB[:table], format: :csv)
|
|
298
308
|
# COPY (SELECT * FROM "table") TO STDOUT (FORMAT csv)
|
|
299
309
|
|
|
300
310
|
It supports putting data into the database via <tt>Database#copy_into</tt>:
|
|
301
311
|
|
|
302
|
-
DB.copy_into(:table, :
|
|
312
|
+
DB.copy_into(:table, format: :csv, columns: [:column1, :column2], data: "1,2\n2,3\n")
|
|
303
313
|
# COPY "table"("column1", "column2") FROM STDIN (FORMAT csv)
|
|
304
314
|
|
|
305
315
|
=== Anonymous Function Execution
|
|
@@ -336,7 +346,7 @@ this blocks until the listening thread is notified:
|
|
|
336
346
|
Note that +listen+ by default only listens for a single notification. If you want to loop and process
|
|
337
347
|
notifications:
|
|
338
348
|
|
|
339
|
-
DB.listen(:channel, :
|
|
349
|
+
DB.listen(:channel, loop: true){|channel| p channel}
|
|
340
350
|
|
|
341
351
|
The +pg_static_cache_updater+ extension uses this support to automatically update
|
|
342
352
|
the caches for models using the +static_cache+ plugin. Look at the documentation of that
|
|
@@ -348,7 +358,7 @@ Sequel makes it easy to lock tables, though it is generally better to let the da
|
|
|
348
358
|
handle locking:
|
|
349
359
|
|
|
350
360
|
DB[:table].lock('EXCLUSIVE') do
|
|
351
|
-
DB[:table].insert(:
|
|
361
|
+
DB[:table].insert(id: DB[:table].max(:id)+1)
|
|
352
362
|
end
|
|
353
363
|
# BEGIN;
|
|
354
364
|
# LOCK TABLE "table" IN EXCLUSIVE MODE;
|
|
@@ -360,14 +370,14 @@ handle locking:
|
|
|
360
370
|
|
|
361
371
|
When the postgres adapter is used with the pg driver, Sequel automatically checks for sequel_pg, and
|
|
362
372
|
loads it if it is available. sequel_pg is a C extension that optimizes the fetching of rows, generally
|
|
363
|
-
resulting in a
|
|
373
|
+
resulting in a ~2x speedup. It is highly recommended to install sequel_pg if you are using the
|
|
364
374
|
postgres adapter with pg.
|
|
365
375
|
|
|
366
|
-
sequel_pg has additional optimizations when using the Dataset +map+, +
|
|
376
|
+
sequel_pg has additional optimizations when using the Dataset +map+, +as_hash+,
|
|
367
377
|
+to_hash_groups+, +select_hash+, +select_hash_groups+, +select_map+, and +select_order_map+ methods,
|
|
368
378
|
which avoids creating intermediate hashes and can add further speedups.
|
|
369
379
|
|
|
370
|
-
In addition to optimization, sequel_pg also adds streaming support if used on PostgreSQL 9.2
|
|
380
|
+
In addition to optimization, sequel_pg also adds streaming support if used on PostgreSQL 9.2+. Streaming
|
|
371
381
|
support is similar to using a cursor, but it is faster and more transparent.
|
|
372
382
|
|
|
373
383
|
You can enable the streaming support:
|
|
@@ -14,7 +14,7 @@ the following adapters:
|
|
|
14
14
|
* sqlite
|
|
15
15
|
* tinytds
|
|
16
16
|
|
|
17
|
-
Support on other adapters is emulated
|
|
17
|
+
Support on other adapters is emulated.
|
|
18
18
|
|
|
19
19
|
You can use the prepared_statements model plugin to automatically use prepared
|
|
20
20
|
statements for some common model actions such as saving or deleting a model
|
|
@@ -29,7 +29,7 @@ significantly for placeholders (e.g. :name, $1, ?). Sequel abstracts all of
|
|
|
29
29
|
that and allows you to specify placeholders by using the :$name format for
|
|
30
30
|
placeholders, e.g.:
|
|
31
31
|
|
|
32
|
-
ds = DB[:items].where(:
|
|
32
|
+
ds = DB[:items].where(name: :$n)
|
|
33
33
|
|
|
34
34
|
You can use these placeholders in most places where you can use the value
|
|
35
35
|
directly. For example, if you want to use placeholders while also using
|
|
@@ -41,45 +41,49 @@ raw SQL, you can do:
|
|
|
41
41
|
|
|
42
42
|
Using bound variables for this query is simple:
|
|
43
43
|
|
|
44
|
-
ds.call(:select, :
|
|
44
|
+
ds.call(:select, n: 'Jim')
|
|
45
45
|
|
|
46
46
|
This will do the equivalent of selecting records that have the name 'Jim'. It
|
|
47
47
|
returns all records, and can take a block that is passed to <tt>Dataset#all</tt>.
|
|
48
48
|
|
|
49
49
|
Deleting or returning the first record works similarly:
|
|
50
50
|
|
|
51
|
-
ds.call(:first, :
|
|
52
|
-
ds.call(:delete, :
|
|
51
|
+
ds.call(:first, n: 'Jim') # First record with name 'Jim'
|
|
52
|
+
ds.call(:delete, n: 'Jim') # Delete records with name 'Jim'
|
|
53
53
|
|
|
54
54
|
For inserting/updating records, you should also specify a value hash, which
|
|
55
55
|
may itself contain placeholders:
|
|
56
56
|
|
|
57
57
|
# Insert record with 'Jim', note that the previous filter is ignored
|
|
58
|
-
ds.call(:insert, {:
|
|
58
|
+
ds.call(:insert, {n: 'Jim'}, name: :$n)
|
|
59
59
|
# Change name to 'Bob' for all records with name of 'Jim'
|
|
60
|
-
ds.call(:update, {:
|
|
60
|
+
ds.call(:update, {n: 'Jim', new_n: 'Bob'}, name: :$new_n)
|
|
61
61
|
|
|
62
62
|
== Prepared Statements
|
|
63
63
|
|
|
64
64
|
Prepared statement support is similar to bound variable support, but you
|
|
65
65
|
use <tt>Dataset#prepare</tt> with a name, and <tt>Dataset#call</tt> or <tt>Database#call</tt> later with the values:
|
|
66
66
|
|
|
67
|
-
ds = DB[:items].where(:
|
|
67
|
+
ds = DB[:items].where(name: :$n)
|
|
68
68
|
ps = ds.prepare(:select, :select_by_name)
|
|
69
|
-
|
|
70
|
-
|
|
69
|
+
|
|
70
|
+
ps.call(n: 'Jim')
|
|
71
|
+
DB.call(:select_by_name, n: 'Jim') # same
|
|
71
72
|
|
|
72
73
|
The <tt>Dataset#prepare</tt> method returns a prepared statement, and also stores a
|
|
73
74
|
copy of the prepared statement in the database for later use. For insert
|
|
74
75
|
and update queries, the hash to insert/update is passed to +prepare+:
|
|
75
76
|
|
|
76
|
-
ps1 = DB[:items].prepare(:insert, :insert_with_name, :
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
77
|
+
ps1 = DB[:items].prepare(:insert, :insert_with_name, name: :$n)
|
|
78
|
+
|
|
79
|
+
ps1.call(n: 'Jim')
|
|
80
|
+
DB.call(:insert_with_name, n: 'Jim') # same
|
|
81
|
+
|
|
82
|
+
ds = DB[:items].where(name: :$n)
|
|
83
|
+
ps2 = ds.prepare(:update, :update_name, name: :$new_n)
|
|
84
|
+
|
|
85
|
+
ps2.call(n: 'Jim', new_n: 'Bob')
|
|
86
|
+
DB.call(:update_name, n: 'Jim', new_n: 'Bob') # same
|
|
83
87
|
|
|
84
88
|
== Implementation Issues
|
|
85
89
|
|
|
@@ -92,7 +96,7 @@ to create prepared statements dynamically at runtime.
|
|
|
92
96
|
|
|
93
97
|
=== PostgreSQL
|
|
94
98
|
|
|
95
|
-
If you are using the
|
|
99
|
+
If you are using the postgres-pr driver, PostgreSQL uses the
|
|
96
100
|
default emulated support. If you are using ruby-pg, there is native support
|
|
97
101
|
for both prepared statements and bound variables. Prepared statements are
|
|
98
102
|
always server side.
|
|
@@ -103,9 +107,10 @@ SQLite supports both prepared statements and bound variables.
|
|
|
103
107
|
|
|
104
108
|
=== MySQL/Mysql2
|
|
105
109
|
|
|
106
|
-
The MySQL
|
|
107
|
-
variable methods
|
|
108
|
-
|
|
110
|
+
The MySQL and Mysql2 <0.4 ruby drivers do not support bound variables, so the bound
|
|
111
|
+
variable methods are emulated. It uses server side prepared statements.
|
|
112
|
+
|
|
113
|
+
Mysql2 0.4+ supports both prepared statements and bound variables.
|
|
109
114
|
|
|
110
115
|
=== JDBC
|
|
111
116
|
|
|
@@ -136,4 +141,4 @@ not currently supported.
|
|
|
136
141
|
|
|
137
142
|
=== All Others
|
|
138
143
|
|
|
139
|
-
Support is emulated
|
|
144
|
+
Support is emulated.
|