sequel 4.26.0 → 5.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/CHANGELOG +405 -5656
- data/MIT-LICENSE +1 -1
- data/README.rdoc +232 -157
- data/bin/sequel +32 -9
- data/doc/advanced_associations.rdoc +252 -188
- data/doc/association_basics.rdoc +231 -273
- data/doc/bin_sequel.rdoc +5 -3
- data/doc/cheat_sheet.rdoc +75 -48
- data/doc/code_order.rdoc +28 -10
- data/doc/core_extensions.rdoc +104 -63
- data/doc/dataset_basics.rdoc +12 -21
- data/doc/dataset_filtering.rdoc +99 -86
- data/doc/extensions.rdoc +3 -10
- data/doc/mass_assignment.rdoc +74 -31
- data/doc/migration.rdoc +72 -46
- data/doc/model_dataset_method_design.rdoc +129 -0
- data/doc/model_hooks.rdoc +15 -25
- data/doc/model_plugins.rdoc +12 -12
- data/doc/mssql_stored_procedures.rdoc +3 -3
- data/doc/object_model.rdoc +59 -69
- data/doc/opening_databases.rdoc +84 -94
- data/doc/postgresql.rdoc +268 -38
- data/doc/prepared_statements.rdoc +29 -24
- data/doc/querying.rdoc +184 -164
- data/doc/reflection.rdoc +5 -6
- data/doc/release_notes/5.0.0.txt +159 -0
- data/doc/release_notes/5.1.0.txt +31 -0
- data/doc/release_notes/5.10.0.txt +84 -0
- data/doc/release_notes/5.11.0.txt +83 -0
- data/doc/release_notes/5.12.0.txt +141 -0
- data/doc/release_notes/5.13.0.txt +27 -0
- data/doc/release_notes/5.14.0.txt +63 -0
- data/doc/release_notes/5.15.0.txt +39 -0
- data/doc/release_notes/5.16.0.txt +110 -0
- data/doc/release_notes/5.17.0.txt +31 -0
- data/doc/release_notes/5.18.0.txt +69 -0
- data/doc/release_notes/5.19.0.txt +28 -0
- data/doc/release_notes/5.2.0.txt +33 -0
- data/doc/release_notes/5.20.0.txt +89 -0
- data/doc/release_notes/5.21.0.txt +87 -0
- data/doc/release_notes/5.22.0.txt +48 -0
- data/doc/release_notes/5.23.0.txt +56 -0
- data/doc/release_notes/5.24.0.txt +56 -0
- data/doc/release_notes/5.25.0.txt +32 -0
- data/doc/release_notes/5.26.0.txt +35 -0
- data/doc/release_notes/5.27.0.txt +21 -0
- data/doc/release_notes/5.28.0.txt +16 -0
- data/doc/release_notes/5.29.0.txt +22 -0
- data/doc/release_notes/5.3.0.txt +121 -0
- data/doc/release_notes/5.30.0.txt +20 -0
- data/doc/release_notes/5.31.0.txt +148 -0
- data/doc/release_notes/5.32.0.txt +46 -0
- data/doc/release_notes/5.33.0.txt +24 -0
- data/doc/release_notes/5.34.0.txt +40 -0
- data/doc/release_notes/5.35.0.txt +56 -0
- data/doc/release_notes/5.36.0.txt +60 -0
- data/doc/release_notes/5.37.0.txt +30 -0
- data/doc/release_notes/5.4.0.txt +80 -0
- data/doc/release_notes/5.5.0.txt +61 -0
- data/doc/release_notes/5.6.0.txt +31 -0
- data/doc/release_notes/5.7.0.txt +108 -0
- data/doc/release_notes/5.8.0.txt +170 -0
- data/doc/release_notes/5.9.0.txt +99 -0
- data/doc/schema_modification.rdoc +102 -77
- data/doc/security.rdoc +160 -87
- data/doc/sharding.rdoc +74 -47
- data/doc/sql.rdoc +135 -122
- data/doc/testing.rdoc +34 -18
- data/doc/thread_safety.rdoc +2 -4
- data/doc/transactions.rdoc +101 -19
- data/doc/validations.rdoc +64 -51
- data/doc/virtual_rows.rdoc +90 -109
- data/lib/sequel.rb +3 -1
- data/lib/sequel/adapters/ado.rb +154 -22
- data/lib/sequel/adapters/ado/access.rb +21 -21
- data/lib/sequel/adapters/ado/mssql.rb +8 -15
- data/lib/sequel/adapters/amalgalite.rb +17 -25
- data/lib/sequel/adapters/ibmdb.rb +52 -58
- data/lib/sequel/adapters/jdbc.rb +149 -127
- data/lib/sequel/adapters/jdbc/db2.rb +32 -40
- data/lib/sequel/adapters/jdbc/derby.rb +56 -58
- data/lib/sequel/adapters/jdbc/h2.rb +40 -30
- data/lib/sequel/adapters/jdbc/hsqldb.rb +22 -33
- data/lib/sequel/adapters/jdbc/jtds.rb +4 -10
- data/lib/sequel/adapters/jdbc/mssql.rb +6 -12
- data/lib/sequel/adapters/jdbc/mysql.rb +17 -18
- data/lib/sequel/adapters/jdbc/oracle.rb +25 -19
- data/lib/sequel/adapters/jdbc/postgresql.rb +90 -69
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +14 -24
- data/lib/sequel/adapters/jdbc/sqlite.rb +50 -12
- data/lib/sequel/adapters/jdbc/sqlserver.rb +36 -9
- data/lib/sequel/adapters/jdbc/transactions.rb +25 -39
- data/lib/sequel/adapters/mock.rb +104 -113
- data/lib/sequel/adapters/mysql.rb +42 -61
- data/lib/sequel/adapters/mysql2.rb +126 -35
- data/lib/sequel/adapters/odbc.rb +21 -28
- data/lib/sequel/adapters/odbc/db2.rb +3 -1
- data/lib/sequel/adapters/odbc/mssql.rb +11 -15
- data/lib/sequel/adapters/odbc/oracle.rb +11 -0
- data/lib/sequel/adapters/oracle.rb +62 -68
- data/lib/sequel/adapters/postgres.rb +257 -311
- data/lib/sequel/adapters/postgresql.rb +3 -1
- data/lib/sequel/adapters/shared/access.rb +75 -79
- data/lib/sequel/adapters/shared/db2.rb +96 -74
- data/lib/sequel/adapters/shared/mssql.rb +258 -213
- data/lib/sequel/adapters/shared/mysql.rb +284 -216
- data/lib/sequel/adapters/shared/oracle.rb +175 -60
- data/lib/sequel/adapters/shared/postgres.rb +829 -383
- data/lib/sequel/adapters/shared/sqlanywhere.rb +105 -127
- data/lib/sequel/adapters/shared/sqlite.rb +382 -159
- data/lib/sequel/adapters/sqlanywhere.rb +53 -38
- data/lib/sequel/adapters/sqlite.rb +111 -105
- data/lib/sequel/adapters/tinytds.rb +38 -46
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +8 -9
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +7 -5
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +87 -0
- data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +56 -0
- data/lib/sequel/adapters/utils/replace.rb +3 -4
- data/lib/sequel/adapters/utils/split_alter_table.rb +2 -0
- data/lib/sequel/adapters/utils/stored_procedures.rb +9 -22
- data/lib/sequel/adapters/utils/unmodified_identifiers.rb +28 -0
- data/lib/sequel/ast_transformer.rb +13 -89
- data/lib/sequel/connection_pool.rb +54 -26
- data/lib/sequel/connection_pool/sharded_single.rb +19 -12
- data/lib/sequel/connection_pool/sharded_threaded.rb +160 -111
- data/lib/sequel/connection_pool/single.rb +21 -12
- data/lib/sequel/connection_pool/threaded.rb +137 -119
- data/lib/sequel/core.rb +352 -320
- data/lib/sequel/database.rb +19 -2
- data/lib/sequel/database/connecting.rb +70 -55
- data/lib/sequel/database/dataset.rb +15 -5
- data/lib/sequel/database/dataset_defaults.rb +20 -102
- data/lib/sequel/database/features.rb +20 -4
- data/lib/sequel/database/logging.rb +25 -7
- data/lib/sequel/database/misc.rb +132 -118
- data/lib/sequel/database/query.rb +51 -28
- data/lib/sequel/database/schema_generator.rb +188 -75
- data/lib/sequel/database/schema_methods.rb +161 -92
- data/lib/sequel/database/transactions.rb +260 -58
- data/lib/sequel/dataset.rb +28 -12
- data/lib/sequel/dataset/actions.rb +354 -170
- data/lib/sequel/dataset/dataset_module.rb +46 -0
- data/lib/sequel/dataset/features.rb +81 -34
- data/lib/sequel/dataset/graph.rb +82 -58
- data/lib/sequel/dataset/misc.rb +139 -47
- data/lib/sequel/dataset/placeholder_literalizer.rb +66 -26
- data/lib/sequel/dataset/prepared_statements.rb +188 -85
- data/lib/sequel/dataset/query.rb +428 -214
- data/lib/sequel/dataset/sql.rb +446 -339
- data/lib/sequel/deprecated.rb +14 -2
- data/lib/sequel/exceptions.rb +48 -16
- data/lib/sequel/extensions/_model_constraint_validations.rb +16 -0
- data/lib/sequel/extensions/_model_pg_row.rb +43 -0
- data/lib/sequel/extensions/_pretty_table.rb +10 -9
- data/lib/sequel/extensions/any_not_empty.rb +45 -0
- data/lib/sequel/extensions/arbitrary_servers.rb +15 -11
- data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
- data/lib/sequel/extensions/blank.rb +2 -0
- data/lib/sequel/extensions/caller_logging.rb +79 -0
- data/lib/sequel/extensions/columns_introspection.rb +9 -4
- data/lib/sequel/extensions/connection_expiration.rb +99 -0
- data/lib/sequel/extensions/connection_validator.rb +26 -13
- data/lib/sequel/extensions/constant_sql_override.rb +65 -0
- data/lib/sequel/extensions/constraint_validations.rb +93 -38
- data/lib/sequel/extensions/core_extensions.rb +45 -53
- data/lib/sequel/extensions/core_refinements.rb +44 -46
- data/lib/sequel/extensions/current_datetime_timestamp.rb +5 -4
- data/lib/sequel/extensions/dataset_source_alias.rb +4 -0
- data/lib/sequel/extensions/date_arithmetic.rb +42 -16
- data/lib/sequel/extensions/datetime_parse_to_time.rb +37 -0
- data/lib/sequel/extensions/duplicate_columns_handler.rb +94 -0
- data/lib/sequel/extensions/empty_array_consider_nulls.rb +7 -3
- data/lib/sequel/extensions/error_sql.rb +7 -3
- data/lib/sequel/extensions/escaped_like.rb +100 -0
- data/lib/sequel/extensions/eval_inspect.rb +14 -15
- data/lib/sequel/extensions/exclude_or_null.rb +68 -0
- data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
- data/lib/sequel/extensions/freeze_datasets.rb +3 -0
- data/lib/sequel/extensions/from_block.rb +2 -31
- data/lib/sequel/extensions/graph_each.rb +19 -6
- data/lib/sequel/extensions/identifier_mangling.rb +180 -0
- data/lib/sequel/extensions/implicit_subquery.rb +48 -0
- data/lib/sequel/extensions/index_caching.rb +109 -0
- data/lib/sequel/extensions/inflector.rb +8 -4
- data/lib/sequel/extensions/integer64.rb +32 -0
- data/lib/sequel/extensions/looser_typecasting.rb +19 -9
- data/lib/sequel/extensions/migration.rb +132 -80
- data/lib/sequel/extensions/mssql_emulate_lateral_with_apply.rb +4 -0
- data/lib/sequel/extensions/named_timezones.rb +88 -23
- data/lib/sequel/extensions/no_auto_literal_strings.rb +4 -0
- data/lib/sequel/extensions/null_dataset.rb +12 -8
- data/lib/sequel/extensions/pagination.rb +35 -28
- data/lib/sequel/extensions/pg_array.rb +227 -316
- data/lib/sequel/extensions/pg_array_ops.rb +19 -7
- data/lib/sequel/extensions/pg_enum.rb +69 -24
- data/lib/sequel/extensions/pg_extended_date_support.rb +250 -0
- data/lib/sequel/extensions/pg_hstore.rb +50 -59
- data/lib/sequel/extensions/pg_hstore_ops.rb +9 -3
- data/lib/sequel/extensions/pg_inet.rb +34 -15
- data/lib/sequel/extensions/pg_inet_ops.rb +5 -1
- data/lib/sequel/extensions/pg_interval.rb +26 -26
- data/lib/sequel/extensions/pg_json.rb +422 -141
- data/lib/sequel/extensions/pg_json_ops.rb +248 -9
- data/lib/sequel/extensions/pg_loose_count.rb +5 -1
- data/lib/sequel/extensions/pg_range.rb +162 -146
- data/lib/sequel/extensions/pg_range_ops.rb +10 -5
- data/lib/sequel/extensions/pg_row.rb +53 -87
- data/lib/sequel/extensions/pg_row_ops.rb +36 -13
- data/lib/sequel/extensions/pg_static_cache_updater.rb +6 -2
- data/lib/sequel/extensions/pg_timestamptz.rb +28 -0
- data/lib/sequel/extensions/pretty_table.rb +4 -0
- data/lib/sequel/extensions/query.rb +12 -7
- data/lib/sequel/extensions/round_timestamps.rb +6 -9
- data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
- data/lib/sequel/extensions/s.rb +59 -0
- data/lib/sequel/extensions/schema_caching.rb +14 -1
- data/lib/sequel/extensions/schema_dumper.rb +83 -55
- data/lib/sequel/extensions/select_remove.rb +8 -4
- data/lib/sequel/extensions/sequel_4_dataset_methods.rb +85 -0
- data/lib/sequel/extensions/server_block.rb +50 -17
- data/lib/sequel/extensions/server_logging.rb +61 -0
- data/lib/sequel/extensions/split_array_nil.rb +8 -4
- data/lib/sequel/extensions/sql_comments.rb +96 -0
- data/lib/sequel/extensions/sql_expr.rb +4 -1
- data/lib/sequel/extensions/string_agg.rb +181 -0
- data/lib/sequel/extensions/string_date_time.rb +2 -0
- data/lib/sequel/extensions/symbol_aref.rb +53 -0
- data/lib/sequel/extensions/symbol_aref_refinement.rb +43 -0
- data/lib/sequel/extensions/symbol_as.rb +23 -0
- data/lib/sequel/extensions/symbol_as_refinement.rb +37 -0
- data/lib/sequel/extensions/synchronize_sql.rb +45 -0
- data/lib/sequel/extensions/thread_local_timezones.rb +4 -0
- data/lib/sequel/extensions/to_dot.rb +15 -5
- data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
- data/lib/sequel/model.rb +36 -126
- data/lib/sequel/model/associations.rb +850 -257
- data/lib/sequel/model/base.rb +652 -764
- data/lib/sequel/model/dataset_module.rb +13 -10
- data/lib/sequel/model/default_inflections.rb +3 -1
- data/lib/sequel/model/errors.rb +3 -3
- data/lib/sequel/model/exceptions.rb +12 -12
- data/lib/sequel/model/inflections.rb +8 -19
- data/lib/sequel/model/plugins.rb +111 -0
- data/lib/sequel/plugins/accessed_columns.rb +2 -0
- data/lib/sequel/plugins/active_model.rb +32 -7
- data/lib/sequel/plugins/after_initialize.rb +3 -1
- data/lib/sequel/plugins/association_dependencies.rb +27 -18
- data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
- data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
- data/lib/sequel/plugins/association_pks.rb +181 -83
- data/lib/sequel/plugins/association_proxies.rb +33 -9
- data/lib/sequel/plugins/auto_validations.rb +58 -23
- data/lib/sequel/plugins/before_after_save.rb +8 -0
- data/lib/sequel/plugins/blacklist_security.rb +23 -12
- data/lib/sequel/plugins/boolean_readers.rb +9 -6
- data/lib/sequel/plugins/boolean_subsets.rb +64 -0
- data/lib/sequel/plugins/caching.rb +27 -16
- data/lib/sequel/plugins/class_table_inheritance.rb +192 -94
- data/lib/sequel/plugins/column_conflicts.rb +18 -3
- data/lib/sequel/plugins/column_select.rb +9 -5
- data/lib/sequel/plugins/columns_updated.rb +42 -0
- data/lib/sequel/plugins/composition.rb +36 -24
- data/lib/sequel/plugins/constraint_validations.rb +37 -16
- data/lib/sequel/plugins/csv_serializer.rb +58 -35
- data/lib/sequel/plugins/dataset_associations.rb +60 -18
- data/lib/sequel/plugins/def_dataset_method.rb +90 -0
- data/lib/sequel/plugins/defaults_setter.rb +74 -13
- data/lib/sequel/plugins/delay_add_association.rb +4 -1
- data/lib/sequel/plugins/dirty.rb +65 -24
- data/lib/sequel/plugins/eager_each.rb +27 -3
- data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
- data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
- data/lib/sequel/plugins/error_splitter.rb +19 -12
- data/lib/sequel/plugins/finder.rb +246 -0
- data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
- data/lib/sequel/plugins/force_encoding.rb +9 -12
- data/lib/sequel/plugins/hook_class_methods.rb +39 -54
- data/lib/sequel/plugins/input_transformer.rb +20 -10
- data/lib/sequel/plugins/insert_conflict.rb +72 -0
- data/lib/sequel/plugins/insert_returning_select.rb +4 -2
- data/lib/sequel/plugins/instance_filters.rb +12 -8
- data/lib/sequel/plugins/instance_hooks.rb +36 -17
- data/lib/sequel/plugins/instance_specific_default.rb +113 -0
- data/lib/sequel/plugins/inverted_subsets.rb +24 -13
- data/lib/sequel/plugins/json_serializer.rb +123 -47
- data/lib/sequel/plugins/lazy_attributes.rb +20 -14
- data/lib/sequel/plugins/list.rb +40 -26
- data/lib/sequel/plugins/many_through_many.rb +28 -12
- data/lib/sequel/plugins/modification_detection.rb +17 -5
- data/lib/sequel/plugins/mssql_optimistic_locking.rb +8 -5
- data/lib/sequel/plugins/nested_attributes.rb +55 -28
- data/lib/sequel/plugins/optimistic_locking.rb +5 -3
- data/lib/sequel/plugins/pg_array_associations.rb +52 -18
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +348 -0
- data/lib/sequel/plugins/pg_row.rb +7 -51
- data/lib/sequel/plugins/prepared_statements.rb +53 -72
- data/lib/sequel/plugins/prepared_statements_safe.rb +13 -5
- data/lib/sequel/plugins/rcte_tree.rb +43 -63
- data/lib/sequel/plugins/serialization.rb +37 -44
- data/lib/sequel/plugins/serialization_modification_detection.rb +3 -1
- data/lib/sequel/plugins/sharding.rb +17 -10
- data/lib/sequel/plugins/single_table_inheritance.rb +62 -28
- data/lib/sequel/plugins/singular_table_names.rb +2 -0
- data/lib/sequel/plugins/skip_create_refresh.rb +5 -3
- data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
- data/lib/sequel/plugins/split_values.rb +13 -6
- data/lib/sequel/plugins/static_cache.rb +79 -53
- data/lib/sequel/plugins/static_cache_cache.rb +53 -0
- data/lib/sequel/plugins/string_stripper.rb +5 -3
- data/lib/sequel/plugins/subclasses.rb +20 -2
- data/lib/sequel/plugins/subset_conditions.rb +48 -0
- data/lib/sequel/plugins/table_select.rb +4 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +120 -6
- data/lib/sequel/plugins/throw_failures.rb +110 -0
- data/lib/sequel/plugins/timestamps.rb +22 -8
- data/lib/sequel/plugins/touch.rb +21 -8
- data/lib/sequel/plugins/tree.rb +57 -30
- data/lib/sequel/plugins/typecast_on_load.rb +14 -4
- data/lib/sequel/plugins/unlimited_update.rb +3 -7
- data/lib/sequel/plugins/update_or_create.rb +6 -4
- data/lib/sequel/plugins/update_primary_key.rb +3 -1
- data/lib/sequel/plugins/update_refresh.rb +28 -15
- data/lib/sequel/plugins/uuid.rb +70 -0
- data/lib/sequel/plugins/validate_associated.rb +20 -0
- data/lib/sequel/plugins/validation_class_methods.rb +40 -19
- data/lib/sequel/plugins/validation_contexts.rb +49 -0
- data/lib/sequel/plugins/validation_helpers.rb +49 -31
- data/lib/sequel/plugins/whitelist_security.rb +122 -0
- data/lib/sequel/plugins/xml_serializer.rb +31 -30
- data/lib/sequel/sql.rb +479 -329
- data/lib/sequel/timezones.rb +62 -32
- data/lib/sequel/version.rb +10 -3
- metadata +177 -477
- data/Rakefile +0 -165
- data/doc/active_record.rdoc +0 -912
- data/doc/release_notes/1.0.txt +0 -38
- data/doc/release_notes/1.1.txt +0 -143
- data/doc/release_notes/1.3.txt +0 -101
- data/doc/release_notes/1.4.0.txt +0 -53
- data/doc/release_notes/1.5.0.txt +0 -155
- data/doc/release_notes/2.0.0.txt +0 -298
- data/doc/release_notes/2.1.0.txt +0 -271
- data/doc/release_notes/2.10.0.txt +0 -328
- data/doc/release_notes/2.11.0.txt +0 -215
- data/doc/release_notes/2.12.0.txt +0 -534
- data/doc/release_notes/2.2.0.txt +0 -253
- data/doc/release_notes/2.3.0.txt +0 -88
- data/doc/release_notes/2.4.0.txt +0 -106
- data/doc/release_notes/2.5.0.txt +0 -137
- data/doc/release_notes/2.6.0.txt +0 -157
- data/doc/release_notes/2.7.0.txt +0 -166
- data/doc/release_notes/2.8.0.txt +0 -171
- data/doc/release_notes/2.9.0.txt +0 -97
- data/doc/release_notes/3.0.0.txt +0 -221
- data/doc/release_notes/3.1.0.txt +0 -406
- data/doc/release_notes/3.10.0.txt +0 -286
- data/doc/release_notes/3.11.0.txt +0 -254
- data/doc/release_notes/3.12.0.txt +0 -304
- data/doc/release_notes/3.13.0.txt +0 -210
- data/doc/release_notes/3.14.0.txt +0 -118
- data/doc/release_notes/3.15.0.txt +0 -78
- data/doc/release_notes/3.16.0.txt +0 -45
- data/doc/release_notes/3.17.0.txt +0 -58
- data/doc/release_notes/3.18.0.txt +0 -120
- data/doc/release_notes/3.19.0.txt +0 -67
- data/doc/release_notes/3.2.0.txt +0 -268
- data/doc/release_notes/3.20.0.txt +0 -41
- data/doc/release_notes/3.21.0.txt +0 -87
- data/doc/release_notes/3.22.0.txt +0 -39
- data/doc/release_notes/3.23.0.txt +0 -172
- data/doc/release_notes/3.24.0.txt +0 -420
- data/doc/release_notes/3.25.0.txt +0 -88
- data/doc/release_notes/3.26.0.txt +0 -88
- data/doc/release_notes/3.27.0.txt +0 -82
- data/doc/release_notes/3.28.0.txt +0 -304
- data/doc/release_notes/3.29.0.txt +0 -459
- data/doc/release_notes/3.3.0.txt +0 -192
- data/doc/release_notes/3.30.0.txt +0 -135
- data/doc/release_notes/3.31.0.txt +0 -146
- data/doc/release_notes/3.32.0.txt +0 -202
- data/doc/release_notes/3.33.0.txt +0 -157
- data/doc/release_notes/3.34.0.txt +0 -671
- data/doc/release_notes/3.35.0.txt +0 -144
- data/doc/release_notes/3.36.0.txt +0 -245
- data/doc/release_notes/3.37.0.txt +0 -338
- data/doc/release_notes/3.38.0.txt +0 -234
- data/doc/release_notes/3.39.0.txt +0 -237
- data/doc/release_notes/3.4.0.txt +0 -325
- data/doc/release_notes/3.40.0.txt +0 -73
- data/doc/release_notes/3.41.0.txt +0 -155
- data/doc/release_notes/3.42.0.txt +0 -74
- data/doc/release_notes/3.43.0.txt +0 -105
- data/doc/release_notes/3.44.0.txt +0 -152
- data/doc/release_notes/3.45.0.txt +0 -179
- data/doc/release_notes/3.46.0.txt +0 -122
- data/doc/release_notes/3.47.0.txt +0 -270
- data/doc/release_notes/3.48.0.txt +0 -477
- data/doc/release_notes/3.5.0.txt +0 -510
- data/doc/release_notes/3.6.0.txt +0 -366
- data/doc/release_notes/3.7.0.txt +0 -179
- data/doc/release_notes/3.8.0.txt +0 -151
- data/doc/release_notes/3.9.0.txt +0 -233
- data/doc/release_notes/4.0.0.txt +0 -262
- data/doc/release_notes/4.1.0.txt +0 -85
- data/doc/release_notes/4.10.0.txt +0 -226
- data/doc/release_notes/4.11.0.txt +0 -147
- data/doc/release_notes/4.12.0.txt +0 -105
- data/doc/release_notes/4.13.0.txt +0 -169
- data/doc/release_notes/4.14.0.txt +0 -68
- data/doc/release_notes/4.15.0.txt +0 -56
- data/doc/release_notes/4.16.0.txt +0 -36
- data/doc/release_notes/4.17.0.txt +0 -38
- data/doc/release_notes/4.18.0.txt +0 -36
- data/doc/release_notes/4.19.0.txt +0 -45
- data/doc/release_notes/4.2.0.txt +0 -129
- data/doc/release_notes/4.20.0.txt +0 -79
- data/doc/release_notes/4.21.0.txt +0 -94
- data/doc/release_notes/4.22.0.txt +0 -72
- data/doc/release_notes/4.23.0.txt +0 -65
- data/doc/release_notes/4.24.0.txt +0 -99
- data/doc/release_notes/4.25.0.txt +0 -181
- data/doc/release_notes/4.26.0.txt +0 -44
- data/doc/release_notes/4.3.0.txt +0 -40
- data/doc/release_notes/4.4.0.txt +0 -92
- data/doc/release_notes/4.5.0.txt +0 -34
- data/doc/release_notes/4.6.0.txt +0 -30
- data/doc/release_notes/4.7.0.txt +0 -103
- data/doc/release_notes/4.8.0.txt +0 -175
- data/doc/release_notes/4.9.0.txt +0 -190
- data/lib/sequel/adapters/cubrid.rb +0 -142
- data/lib/sequel/adapters/do.rb +0 -156
- data/lib/sequel/adapters/do/mysql.rb +0 -64
- data/lib/sequel/adapters/do/postgres.rb +0 -42
- data/lib/sequel/adapters/do/sqlite3.rb +0 -40
- data/lib/sequel/adapters/jdbc/as400.rb +0 -82
- data/lib/sequel/adapters/jdbc/cubrid.rb +0 -62
- data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -34
- data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -31
- data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -31
- data/lib/sequel/adapters/odbc/progress.rb +0 -8
- data/lib/sequel/adapters/shared/cubrid.rb +0 -243
- data/lib/sequel/adapters/shared/firebird.rb +0 -245
- data/lib/sequel/adapters/shared/informix.rb +0 -52
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +0 -150
- data/lib/sequel/adapters/shared/progress.rb +0 -38
- data/lib/sequel/adapters/swift.rb +0 -158
- data/lib/sequel/adapters/swift/mysql.rb +0 -47
- data/lib/sequel/adapters/swift/postgres.rb +0 -45
- data/lib/sequel/adapters/swift/sqlite.rb +0 -47
- data/lib/sequel/adapters/utils/pg_types.rb +0 -68
- data/lib/sequel/dataset/mutation.rb +0 -109
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -3
- data/lib/sequel/extensions/filter_having.rb +0 -59
- data/lib/sequel/extensions/hash_aliases.rb +0 -45
- data/lib/sequel/extensions/meta_def.rb +0 -31
- data/lib/sequel/extensions/query_literals.rb +0 -80
- data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -22
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -118
- data/lib/sequel/extensions/set_overrides.rb +0 -72
- data/lib/sequel/no_core_ext.rb +0 -1
- data/lib/sequel/plugins/association_autoreloading.rb +0 -7
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -7
- data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -78
- data/lib/sequel/plugins/prepared_statements_associations.rb +0 -117
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -59
- data/lib/sequel/plugins/schema.rb +0 -80
- data/lib/sequel/plugins/scissors.rb +0 -33
- data/spec/adapters/db2_spec.rb +0 -160
- data/spec/adapters/firebird_spec.rb +0 -411
- data/spec/adapters/informix_spec.rb +0 -100
- data/spec/adapters/mssql_spec.rb +0 -706
- data/spec/adapters/mysql_spec.rb +0 -1287
- data/spec/adapters/oracle_spec.rb +0 -313
- data/spec/adapters/postgres_spec.rb +0 -3725
- data/spec/adapters/spec_helper.rb +0 -43
- data/spec/adapters/sqlanywhere_spec.rb +0 -170
- data/spec/adapters/sqlite_spec.rb +0 -653
- data/spec/bin_spec.rb +0 -254
- data/spec/core/connection_pool_spec.rb +0 -1016
- data/spec/core/database_spec.rb +0 -2531
- data/spec/core/dataset_spec.rb +0 -5098
- data/spec/core/deprecated_spec.rb +0 -70
- data/spec/core/expression_filters_spec.rb +0 -1243
- data/spec/core/mock_adapter_spec.rb +0 -462
- data/spec/core/object_graph_spec.rb +0 -303
- data/spec/core/placeholder_literalizer_spec.rb +0 -163
- data/spec/core/schema_generator_spec.rb +0 -179
- data/spec/core/schema_spec.rb +0 -1659
- data/spec/core/spec_helper.rb +0 -34
- data/spec/core/version_spec.rb +0 -7
- data/spec/core_extensions_spec.rb +0 -699
- data/spec/extensions/accessed_columns_spec.rb +0 -51
- data/spec/extensions/active_model_spec.rb +0 -123
- data/spec/extensions/after_initialize_spec.rb +0 -24
- data/spec/extensions/arbitrary_servers_spec.rb +0 -109
- data/spec/extensions/association_dependencies_spec.rb +0 -117
- data/spec/extensions/association_pks_spec.rb +0 -365
- data/spec/extensions/association_proxies_spec.rb +0 -86
- data/spec/extensions/auto_validations_spec.rb +0 -192
- data/spec/extensions/blacklist_security_spec.rb +0 -88
- data/spec/extensions/blank_spec.rb +0 -69
- data/spec/extensions/boolean_readers_spec.rb +0 -93
- data/spec/extensions/caching_spec.rb +0 -270
- data/spec/extensions/class_table_inheritance_spec.rb +0 -420
- data/spec/extensions/column_conflicts_spec.rb +0 -60
- data/spec/extensions/column_select_spec.rb +0 -108
- data/spec/extensions/columns_introspection_spec.rb +0 -91
- data/spec/extensions/composition_spec.rb +0 -242
- data/spec/extensions/connection_validator_spec.rb +0 -120
- data/spec/extensions/constraint_validations_plugin_spec.rb +0 -274
- data/spec/extensions/constraint_validations_spec.rb +0 -325
- data/spec/extensions/core_refinements_spec.rb +0 -519
- data/spec/extensions/csv_serializer_spec.rb +0 -173
- data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
- data/spec/extensions/dataset_associations_spec.rb +0 -311
- data/spec/extensions/dataset_source_alias_spec.rb +0 -51
- data/spec/extensions/date_arithmetic_spec.rb +0 -150
- data/spec/extensions/defaults_setter_spec.rb +0 -101
- data/spec/extensions/delay_add_association_spec.rb +0 -52
- data/spec/extensions/dirty_spec.rb +0 -180
- data/spec/extensions/eager_each_spec.rb +0 -42
- data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
- data/spec/extensions/error_splitter_spec.rb +0 -18
- data/spec/extensions/error_sql_spec.rb +0 -20
- data/spec/extensions/eval_inspect_spec.rb +0 -73
- data/spec/extensions/filter_having_spec.rb +0 -40
- data/spec/extensions/force_encoding_spec.rb +0 -114
- data/spec/extensions/from_block_spec.rb +0 -21
- data/spec/extensions/graph_each_spec.rb +0 -109
- data/spec/extensions/hash_aliases_spec.rb +0 -24
- data/spec/extensions/hook_class_methods_spec.rb +0 -429
- data/spec/extensions/inflector_spec.rb +0 -183
- data/spec/extensions/input_transformer_spec.rb +0 -54
- data/spec/extensions/insert_returning_select_spec.rb +0 -46
- data/spec/extensions/instance_filters_spec.rb +0 -79
- data/spec/extensions/instance_hooks_spec.rb +0 -276
- data/spec/extensions/inverted_subsets_spec.rb +0 -33
- data/spec/extensions/json_serializer_spec.rb +0 -291
- data/spec/extensions/lazy_attributes_spec.rb +0 -170
- data/spec/extensions/list_spec.rb +0 -267
- data/spec/extensions/looser_typecasting_spec.rb +0 -43
- data/spec/extensions/many_through_many_spec.rb +0 -2172
- data/spec/extensions/meta_def_spec.rb +0 -21
- data/spec/extensions/migration_spec.rb +0 -712
- data/spec/extensions/modification_detection_spec.rb +0 -80
- data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -91
- data/spec/extensions/named_timezones_spec.rb +0 -108
- data/spec/extensions/nested_attributes_spec.rb +0 -697
- data/spec/extensions/null_dataset_spec.rb +0 -85
- data/spec/extensions/optimistic_locking_spec.rb +0 -128
- data/spec/extensions/pagination_spec.rb +0 -118
- data/spec/extensions/pg_array_associations_spec.rb +0 -736
- data/spec/extensions/pg_array_ops_spec.rb +0 -143
- data/spec/extensions/pg_array_spec.rb +0 -395
- data/spec/extensions/pg_enum_spec.rb +0 -92
- data/spec/extensions/pg_hstore_ops_spec.rb +0 -236
- data/spec/extensions/pg_hstore_spec.rb +0 -206
- data/spec/extensions/pg_inet_ops_spec.rb +0 -101
- data/spec/extensions/pg_inet_spec.rb +0 -52
- data/spec/extensions/pg_interval_spec.rb +0 -76
- data/spec/extensions/pg_json_ops_spec.rb +0 -229
- data/spec/extensions/pg_json_spec.rb +0 -218
- data/spec/extensions/pg_loose_count_spec.rb +0 -17
- data/spec/extensions/pg_range_ops_spec.rb +0 -58
- data/spec/extensions/pg_range_spec.rb +0 -404
- data/spec/extensions/pg_row_ops_spec.rb +0 -60
- data/spec/extensions/pg_row_plugin_spec.rb +0 -62
- data/spec/extensions/pg_row_spec.rb +0 -360
- data/spec/extensions/pg_static_cache_updater_spec.rb +0 -92
- data/spec/extensions/pg_typecast_on_load_spec.rb +0 -63
- data/spec/extensions/prepared_statements_associations_spec.rb +0 -159
- data/spec/extensions/prepared_statements_safe_spec.rb +0 -61
- data/spec/extensions/prepared_statements_spec.rb +0 -103
- data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -31
- data/spec/extensions/pretty_table_spec.rb +0 -92
- data/spec/extensions/query_literals_spec.rb +0 -183
- data/spec/extensions/query_spec.rb +0 -102
- data/spec/extensions/rcte_tree_spec.rb +0 -392
- data/spec/extensions/round_timestamps_spec.rb +0 -43
- data/spec/extensions/schema_caching_spec.rb +0 -41
- data/spec/extensions/schema_dumper_spec.rb +0 -789
- data/spec/extensions/schema_spec.rb +0 -117
- data/spec/extensions/scissors_spec.rb +0 -26
- data/spec/extensions/select_remove_spec.rb +0 -38
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -101
- data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
- data/spec/extensions/serialization_spec.rb +0 -362
- data/spec/extensions/server_block_spec.rb +0 -90
- data/spec/extensions/set_overrides_spec.rb +0 -61
- data/spec/extensions/sharding_spec.rb +0 -198
- data/spec/extensions/shared_caching_spec.rb +0 -175
- data/spec/extensions/single_table_inheritance_spec.rb +0 -297
- data/spec/extensions/singular_table_names_spec.rb +0 -22
- data/spec/extensions/skip_create_refresh_spec.rb +0 -17
- data/spec/extensions/spec_helper.rb +0 -71
- data/spec/extensions/split_array_nil_spec.rb +0 -24
- data/spec/extensions/split_values_spec.rb +0 -22
- data/spec/extensions/sql_expr_spec.rb +0 -60
- data/spec/extensions/static_cache_spec.rb +0 -361
- data/spec/extensions/string_date_time_spec.rb +0 -95
- data/spec/extensions/string_stripper_spec.rb +0 -68
- data/spec/extensions/subclasses_spec.rb +0 -66
- data/spec/extensions/table_select_spec.rb +0 -71
- data/spec/extensions/tactical_eager_loading_spec.rb +0 -82
- data/spec/extensions/thread_local_timezones_spec.rb +0 -67
- data/spec/extensions/timestamps_spec.rb +0 -175
- data/spec/extensions/to_dot_spec.rb +0 -154
- data/spec/extensions/touch_spec.rb +0 -203
- data/spec/extensions/tree_spec.rb +0 -274
- data/spec/extensions/typecast_on_load_spec.rb +0 -80
- data/spec/extensions/unlimited_update_spec.rb +0 -20
- data/spec/extensions/update_or_create_spec.rb +0 -87
- data/spec/extensions/update_primary_key_spec.rb +0 -100
- data/spec/extensions/update_refresh_spec.rb +0 -53
- data/spec/extensions/validate_associated_spec.rb +0 -52
- data/spec/extensions/validation_class_methods_spec.rb +0 -1027
- data/spec/extensions/validation_helpers_spec.rb +0 -541
- data/spec/extensions/xml_serializer_spec.rb +0 -207
- data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
- data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
- data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
- data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
- data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
- data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
- data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
- data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
- data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
- data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/reversible_migrations/001_reversible.rb +0 -5
- data/spec/files/reversible_migrations/002_reversible.rb +0 -5
- data/spec/files/reversible_migrations/003_reversible.rb +0 -5
- data/spec/files/reversible_migrations/004_reversible.rb +0 -5
- data/spec/files/reversible_migrations/005_reversible.rb +0 -10
- data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
- data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
- data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
- data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
- data/spec/guards_helper.rb +0 -55
- data/spec/integration/associations_test.rb +0 -2454
- data/spec/integration/database_test.rb +0 -113
- data/spec/integration/dataset_test.rb +0 -1808
- data/spec/integration/eager_loader_test.rb +0 -687
- data/spec/integration/migrator_test.rb +0 -240
- data/spec/integration/model_test.rb +0 -226
- data/spec/integration/plugin_test.rb +0 -2240
- data/spec/integration/prepared_statement_test.rb +0 -467
- data/spec/integration/schema_test.rb +0 -817
- data/spec/integration/spec_helper.rb +0 -48
- data/spec/integration/timezone_test.rb +0 -86
- data/spec/integration/transaction_test.rb +0 -374
- data/spec/integration/type_test.rb +0 -133
- data/spec/model/association_reflection_spec.rb +0 -525
- data/spec/model/associations_spec.rb +0 -4426
- data/spec/model/base_spec.rb +0 -759
- data/spec/model/class_dataset_methods_spec.rb +0 -146
- data/spec/model/dataset_methods_spec.rb +0 -149
- data/spec/model/eager_loading_spec.rb +0 -2137
- data/spec/model/hooks_spec.rb +0 -604
- data/spec/model/inflector_spec.rb +0 -26
- data/spec/model/model_spec.rb +0 -982
- data/spec/model/plugins_spec.rb +0 -299
- data/spec/model/record_spec.rb +0 -2147
- data/spec/model/spec_helper.rb +0 -46
- data/spec/model/validations_spec.rb +0 -193
- data/spec/sequel_coverage.rb +0 -15
- data/spec/spec_config.rb +0 -10
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,21 @@ 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
|
+
|
|
66
|
+
With regard to common database types, please note that the generic String type
|
|
67
|
+
is +text+ on PostgreSQL and not <tt>varchar(255)</tt> as it is on some other
|
|
68
|
+
databases. +text+ is PostgreSQL's recommended type for storage of text data,
|
|
69
|
+
and is more similar to Ruby's String type as it allows for unlimited length.
|
|
70
|
+
If you want to set a maximum size for a text column, you must specify a
|
|
71
|
+
<tt>:size</tt> option. This will use a <tt>varchar($size)</tt> type and
|
|
72
|
+
impose a maximum size for the column.
|
|
73
|
+
|
|
59
74
|
== PostgreSQL-specific DDL Support
|
|
60
75
|
|
|
61
76
|
=== Exclusion Constraints
|
|
@@ -64,7 +79,7 @@ In +create_table+ blocks, you can use the +exclude+ method to set up exclusion c
|
|
|
64
79
|
|
|
65
80
|
DB.create_table(:table) do
|
|
66
81
|
daterange :during
|
|
67
|
-
exclude([[:during, '&&']], :
|
|
82
|
+
exclude([[:during, '&&']], name: :table_during_excl)
|
|
68
83
|
end
|
|
69
84
|
# CREATE TABLE "table" ("during" daterange,
|
|
70
85
|
# CONSTRAINT "table_during_excl" EXCLUDE USING gist ("during" WITH &&))
|
|
@@ -72,20 +87,20 @@ In +create_table+ blocks, you can use the +exclude+ method to set up exclusion c
|
|
|
72
87
|
You can also add exclusion constraints in +alter_table+ blocks using add_exclusion_constraint:
|
|
73
88
|
|
|
74
89
|
DB.alter_table(:table) do
|
|
75
|
-
add_exclusion_constraint([[:during, '&&']], :
|
|
90
|
+
add_exclusion_constraint([[:during, '&&']], name: :table_during_excl)
|
|
76
91
|
end
|
|
77
92
|
# ALTER TABLE "table" ADD CONSTRAINT "table_during_excl" EXCLUDE USING gist ("during" WITH &&)
|
|
78
93
|
|
|
79
94
|
=== Adding Foreign Key and Check Constraints Without Initial Validation
|
|
80
95
|
|
|
81
|
-
You can add a <tt
|
|
96
|
+
You can add a <tt>not_valid: true</tt> option when adding constraints to existing tables so
|
|
82
97
|
that it doesn't check if all current rows are valid:
|
|
83
98
|
|
|
84
99
|
DB.alter_table(:table) do
|
|
85
100
|
# Assumes t_id column already exists
|
|
86
|
-
add_foreign_key([:t_id], :table, :
|
|
101
|
+
add_foreign_key([:t_id], :table, not_valid: true, name: :table_fk)
|
|
87
102
|
|
|
88
|
-
constraint({:
|
|
103
|
+
constraint({name: :col_123, not_valid: true}, col: [1,2,3])
|
|
89
104
|
end
|
|
90
105
|
# ALTER TABLE "table" ADD CONSTRAINT "table_fk" FOREIGN KEY ("t_id") REFERENCES "table" NOT VALID
|
|
91
106
|
# ALTER TABLE "table" ADD CONSTRAINT "col_123" CHECK (col IN (1, 2, 3)) NOT VALID
|
|
@@ -102,14 +117,14 @@ all existing rows have been fixed, you can validate the constraint:
|
|
|
102
117
|
|
|
103
118
|
=== Creating Indexes Concurrently
|
|
104
119
|
|
|
105
|
-
You can create indexes concurrently using the <tt
|
|
120
|
+
You can create indexes concurrently using the <tt>concurrently: true</tt> option:
|
|
106
121
|
|
|
107
|
-
DB.add_index(:table, :t_id, :
|
|
122
|
+
DB.add_index(:table, :t_id, concurrently: true)
|
|
108
123
|
# CREATE INDEX CONCURRENTLY "table_t_id_index" ON "table" ("t_id")
|
|
109
124
|
|
|
110
125
|
Similarly, you can drop indexes concurrently as well:
|
|
111
126
|
|
|
112
|
-
DB.drop_index(:table, :t_id, :
|
|
127
|
+
DB.drop_index(:table, :t_id, concurrently: true)
|
|
113
128
|
# DROP INDEX CONCURRENTLY "table_t_id_index"
|
|
114
129
|
|
|
115
130
|
=== Specific Conversions When Altering Column Types
|
|
@@ -119,19 +134,105 @@ conversion via a USING clause, and Sequel supports this using the <tt>:using</tt
|
|
|
119
134
|
|
|
120
135
|
DB.alter_table(:table) do
|
|
121
136
|
# Assume unix_time column is stored as an integer, and you want to change it to timestamp
|
|
122
|
-
set_column_type :unix_time, Time, :
|
|
137
|
+
set_column_type :unix_time, Time, using: (Sequel.cast('epoch', Time) + Sequel.cast('1 second', :interval) * :unix_time)
|
|
123
138
|
end
|
|
124
139
|
# ALTER TABLE "table" ALTER COLUMN "unix_time" TYPE timestamp
|
|
125
140
|
# USING (CAST('epoch' AS timestamp) + (CAST('1 second' AS interval) * "unix_time"))
|
|
126
141
|
|
|
142
|
+
=== Creating Partitioned Tables
|
|
143
|
+
|
|
144
|
+
PostgreSQL allows marking tables as partitioned tables, and adding partitions to such tables. Sequel
|
|
145
|
+
offers support for this. You can create a partitioned table using the +:partition_by+ option and
|
|
146
|
+
+:partition_type+ options (the default partition type is range partitioning):
|
|
147
|
+
|
|
148
|
+
DB.create_table(:table1, partition_by: :column, partition_type: :range) do
|
|
149
|
+
Integer :id
|
|
150
|
+
Date :column
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
DB.create_table(:table2, partition_by: :column, partition_type: :list) do
|
|
154
|
+
Integer :id
|
|
155
|
+
String :column
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
DB.create_table(:table3, partition_by: :column, partition_type: :hash) do
|
|
159
|
+
Integer :id
|
|
160
|
+
Integer :column
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
To add partitions of other tables, you use the +:partition_of+ option. This option will use
|
|
164
|
+
a custom DSL specific to partitioning other tables. For range partitioning, you can use the
|
|
165
|
+
+from+ and +to+ methods to specify the inclusive beginning and exclusive ending of the
|
|
166
|
+
range of the partition. You can call the +minvalue+ and +maxvalue+ methods to get the minimum
|
|
167
|
+
and maximum values for the column(s) in the range, useful as arguments to +from+ and +to+:
|
|
168
|
+
|
|
169
|
+
DB.create_table(:table1a, partition_of: :table1) do
|
|
170
|
+
from minvalue
|
|
171
|
+
to 0
|
|
172
|
+
end
|
|
173
|
+
DB.create_table(:table1b, partition_of: :table1) do
|
|
174
|
+
from 0
|
|
175
|
+
to 100
|
|
176
|
+
end
|
|
177
|
+
DB.create_table(:table1c, partition_of: :table1) do
|
|
178
|
+
from 100
|
|
179
|
+
to maxvalue
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
For list partitioning, you use the +values_in+ method. You can also use the +default+ method
|
|
183
|
+
to mark a partition as the default partition:
|
|
184
|
+
|
|
185
|
+
DB.create_table(:table2a, partition_of: :table2) do
|
|
186
|
+
values_in 1, 2, 3
|
|
187
|
+
end
|
|
188
|
+
DB.create_table(:table2b, partition_of: :table2) do
|
|
189
|
+
values_in 4, 5, 6
|
|
190
|
+
end
|
|
191
|
+
DB.create_table(:table2c, partition_of: :table2) do
|
|
192
|
+
default
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
For hash partitioning, you use the +modulus+ and +remainder+ methods:
|
|
196
|
+
|
|
197
|
+
DB.create_table(:table3a, partition_of: :table3) do
|
|
198
|
+
modulus 3
|
|
199
|
+
remainder 0
|
|
200
|
+
end
|
|
201
|
+
DB.create_table(:table3b, partition_of: :table3) do
|
|
202
|
+
modulus 3
|
|
203
|
+
remainder 1
|
|
204
|
+
end
|
|
205
|
+
DB.create_table(:table3c, partition_of: :table3) do
|
|
206
|
+
modulus 3
|
|
207
|
+
remainder 2
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
There is currently no support for using custom column or table constraints in partitions of
|
|
211
|
+
other tables. Support may be added in the future.
|
|
212
|
+
|
|
127
213
|
=== Creating Unlogged Tables
|
|
128
214
|
|
|
129
215
|
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
|
|
216
|
+
allows you do create an unlogged table by specifying the <tt>unlogged: true</tt> option to +create_table+:
|
|
131
217
|
|
|
132
|
-
DB.create_table(:table, :
|
|
218
|
+
DB.create_table(:table, unlogged: true){Integer :i}
|
|
133
219
|
# CREATE UNLOGGED TABLE "table" ("i" integer)
|
|
134
220
|
|
|
221
|
+
=== Creating Identity Columns
|
|
222
|
+
|
|
223
|
+
You can use the +:identity+ option when creating columns to mark them as identity columns.
|
|
224
|
+
Identity columns are tied to a sequence for the default value. You can still override the
|
|
225
|
+
default value for the column when inserting:
|
|
226
|
+
|
|
227
|
+
DB.create_table(:table){Integer :id, identity: true}
|
|
228
|
+
# CREATE TABLE "table" ("id" integer GENERATED BY DEFAULT AS IDENTITY)
|
|
229
|
+
|
|
230
|
+
If you want to disallow using a user provided value when inserting, you can mark the
|
|
231
|
+
identity column using <tt>identity: :always</tt>:
|
|
232
|
+
|
|
233
|
+
DB.create_table(:table){Integer :id, identity: :always}
|
|
234
|
+
# CREATE TABLE "table" ("id" integer GENERATED ALWAYS AS IDENTITY)
|
|
235
|
+
|
|
135
236
|
=== Creating/Dropping Schemas, Languages, Functions, and Triggers
|
|
136
237
|
|
|
137
238
|
Sequel has built in support for creating and dropping PostgreSQL schemas, procedural languages, functions, and triggers:
|
|
@@ -146,7 +247,7 @@ Sequel has built in support for creating and dropping PostgreSQL schemas, proced
|
|
|
146
247
|
DB.drop_language(:plperl)
|
|
147
248
|
# DROP LANGUAGE plperl
|
|
148
249
|
|
|
149
|
-
DB.create_function(:set_updated_at, <<-SQL, :
|
|
250
|
+
DB.create_function(:set_updated_at, <<-SQL, language: :plpgsql, returns: :trigger)
|
|
150
251
|
BEGIN
|
|
151
252
|
NEW.updated_at := CURRENT_TIMESTAMP;
|
|
152
253
|
RETURN NEW;
|
|
@@ -160,11 +261,56 @@ Sequel has built in support for creating and dropping PostgreSQL schemas, proced
|
|
|
160
261
|
DB.drop_function(:set_updated_at)
|
|
161
262
|
# DROP FUNCTION set_updated_at()
|
|
162
263
|
|
|
163
|
-
DB.create_trigger(:table, :trg_updated_at, :set_updated_at, :
|
|
264
|
+
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
265
|
# 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
266
|
DB.drop_trigger(:table, :trg_updated_at)
|
|
166
267
|
# DROP TRIGGER trg_updated_at ON "table"
|
|
167
268
|
|
|
269
|
+
However, you may want to consider just use <tt>Database#run</tt> with the necessary SQL code, at least for functions and triggers.
|
|
270
|
+
|
|
271
|
+
=== Parsing Check Constraints
|
|
272
|
+
|
|
273
|
+
Sequel has support for parsing CHECK constraints on PostgreSQL using <tt>Sequel::Database#check_constraints</tt>:
|
|
274
|
+
|
|
275
|
+
DB.create_table(:foo) do
|
|
276
|
+
Integer :i
|
|
277
|
+
Integer :j
|
|
278
|
+
constraint(:ic, Sequel[:i] > 2)
|
|
279
|
+
constraint(:jc, Sequel[:j] > 2)
|
|
280
|
+
constraint(:ijc, Sequel[:i] - Sequel[:j] > 2)
|
|
281
|
+
end
|
|
282
|
+
DB.check_constraints(:foo)
|
|
283
|
+
# => {
|
|
284
|
+
# :ic=>{:definition=>"CHECK ((i > 2))", :columns=>[:i]},
|
|
285
|
+
# :jc=>{:definition=>"CHECK ((j > 2))", :columns=>[:j]},
|
|
286
|
+
# :ijc=>{:definition=>"CHECK (((i - j) > 2))", :columns=>[:i, :j]}
|
|
287
|
+
# }
|
|
288
|
+
|
|
289
|
+
=== Parsing Foreign Key Constraints Referencing A Given Table
|
|
290
|
+
|
|
291
|
+
Sequel has support for parsing FOREIGN KEY constraints that reference a given table, using the +:reverse+
|
|
292
|
+
option to +foreign_key_list+:
|
|
293
|
+
|
|
294
|
+
DB.create_table!(:a) do
|
|
295
|
+
primary_key :id
|
|
296
|
+
Integer :i
|
|
297
|
+
Integer :j
|
|
298
|
+
foreign_key :a_id, :a, :foreign_key_constraint_name=>:a_a
|
|
299
|
+
unique [:i, :j]
|
|
300
|
+
end
|
|
301
|
+
DB.create_table!(:b) do
|
|
302
|
+
foreign_key :a_id, :a, :foreign_key_constraint_name=>:a_a
|
|
303
|
+
Integer :c
|
|
304
|
+
Integer :d
|
|
305
|
+
foreign_key [:c, :d], :a, :key=>[:j, :i], :name=>:a_c_d
|
|
306
|
+
end
|
|
307
|
+
DB.foreign_key_list(:a, :reverse=>true)
|
|
308
|
+
# => [
|
|
309
|
+
# {:name=>:a_a, :columns=>[:a_id], :key=>[:id], :on_update=>:no_action, :on_delete=>:no_action, :deferrable=>false, :table=>:a, :schema=>:public},
|
|
310
|
+
# {:name=>:a_a, :columns=>[:a_id], :key=>[:id], :on_update=>:no_action, :on_delete=>:no_action, :deferrable=>false, :table=>:b, :schema=>:public},
|
|
311
|
+
# {:name=>:a_c_d, :columns=>[:c, :d], :key=>[:j, :i], :on_update=>:no_action, :on_delete=>:no_action, :deferrable=>false, :table=>:b, :schema=>:public}
|
|
312
|
+
# ]
|
|
313
|
+
|
|
168
314
|
== PostgreSQL-specific DML Support
|
|
169
315
|
|
|
170
316
|
=== Returning Rows From Insert, Update, and Delete Statements
|
|
@@ -178,39 +324,52 @@ Sequel supports the ability to return rows from insert, update, and delete state
|
|
|
178
324
|
DB[:table].returning(:id).delete
|
|
179
325
|
# DELETE FROM "table" RETURNING "id"
|
|
180
326
|
|
|
181
|
-
DB[:table].returning(:id, Sequel.*(:id, :id).as(:idsq)).update(:
|
|
327
|
+
DB[:table].returning(:id, Sequel.*(:id, :id).as(:idsq)).update(id: 2)
|
|
182
328
|
# UPDATE "table" SET "id" = 2 RETURNING "id", ("id" * "id") AS "idsq"
|
|
183
329
|
|
|
184
330
|
When returning is used, instead of returning the number of rows affected (for updated/delete)
|
|
185
331
|
or the serial primary key value (for insert), it will return an array of hashes with the
|
|
186
|
-
|
|
332
|
+
returning results.
|
|
333
|
+
|
|
334
|
+
=== VALUES Support
|
|
335
|
+
|
|
336
|
+
Sequel offers support for the +VALUES+ statement using <tt>Database#values</tt>:
|
|
337
|
+
|
|
338
|
+
DB.values([[1,2],[2,3],[3,4]])
|
|
339
|
+
# VALUES (1, 2), (2, 3), (3, 4)
|
|
340
|
+
|
|
341
|
+
DB.values([[1,2],[2,3],[3,4]]).order(2, 1)
|
|
342
|
+
# VALUES (1, 2), (2, 3), (3, 4) ORDER BY 2, 1
|
|
343
|
+
|
|
344
|
+
DB.values([[1,2],[2,3],[3,4]]).order(2, 1).limit(1,2)
|
|
345
|
+
# VALUES (1, 2), (2, 3), (3, 4) ORDER BY 2, 1 LIMIT 1 OFFSET 2
|
|
187
346
|
|
|
188
347
|
=== INSERT ON CONFLICT Support
|
|
189
348
|
|
|
190
349
|
Starting with PostgreSQL 9.5, you can do an upsert or ignore unique or exclusion constraint
|
|
191
350
|
violations when inserting using <tt>Dataset#insert_conflict</tt>:
|
|
192
351
|
|
|
193
|
-
DB[:table].insert_conflict.insert(:
|
|
352
|
+
DB[:table].insert_conflict.insert(a: 1, b: 2)
|
|
194
353
|
# INSERT INTO TABLE (a, b) VALUES (1, 2)
|
|
195
354
|
# ON CONFLICT DO NOTHING
|
|
196
355
|
|
|
197
356
|
For compatibility with Sequel's MySQL support, you can also use +insert_ignore+:
|
|
198
357
|
|
|
199
|
-
DB[:table].insert_ignore.insert(:
|
|
358
|
+
DB[:table].insert_ignore.insert(a: 1, b: 2)
|
|
200
359
|
# INSERT INTO TABLE (a, b) VALUES (1, 2)
|
|
201
360
|
# ON CONFLICT DO NOTHING
|
|
202
361
|
|
|
203
362
|
You can pass a specific constraint name using +:constraint+, to only ignore a specific
|
|
204
363
|
constraint violation:
|
|
205
364
|
|
|
206
|
-
DB[:table].insert_conflict(:
|
|
365
|
+
DB[:table].insert_conflict(constraint: :table_a_uidx).insert(a: 1, b: 2)
|
|
207
366
|
# INSERT INTO TABLE (a, b) VALUES (1, 2)
|
|
208
367
|
# ON CONFLICT ON CONSTRAINT table_a_uidx DO NOTHING
|
|
209
368
|
|
|
210
369
|
If the unique or exclusion constraint covers the whole table (e.g. it isn't a partial unique
|
|
211
370
|
index), then you can just specify the column using the +:target+ option:
|
|
212
371
|
|
|
213
|
-
DB[:table].insert_conflict(:
|
|
372
|
+
DB[:table].insert_conflict(target: :a).insert(a: 1, b: 2)
|
|
214
373
|
# INSERT INTO TABLE (a, b) VALUES (1, 2)
|
|
215
374
|
# ON CONFLICT (a) DO NOTHING
|
|
216
375
|
|
|
@@ -218,20 +377,49 @@ If you want to update the existing row instead of ignoring the constraint violat
|
|
|
218
377
|
can pass an +:update+ option with a hash of values to update. You must pass either the
|
|
219
378
|
+:target+ or +:constraint+ options when passing the +:update+ option:
|
|
220
379
|
|
|
221
|
-
DB[:table].insert_conflict(:
|
|
380
|
+
DB[:table].insert_conflict(target: :a, update: {b: Sequel[:excluded][:b]}).insert(a: 1, b: 2)
|
|
222
381
|
# INSERT INTO TABLE (a, b) VALUES (1, 2)
|
|
223
382
|
# ON CONFLICT (a) DO UPDATE SET b = excluded.b
|
|
383
|
+
|
|
384
|
+
If you want to update existing rows but using the current value of the column, you can build
|
|
385
|
+
the desired calculation using <tt>Sequel[]</tt>
|
|
386
|
+
|
|
387
|
+
DB[:table]
|
|
388
|
+
.insert_conflict(
|
|
389
|
+
target: :a,
|
|
390
|
+
update: {b: Sequel[:excluded][:b] + Sequel[:table][:a]}
|
|
391
|
+
)
|
|
392
|
+
.import([:a, :b], [ [1, 2] ])
|
|
393
|
+
# INSERT INTO TABLE (a, b) VALUES (1, 2)
|
|
394
|
+
# ON CONFLICT (a) DO UPDATE SET b = (excluded.b + table.a)
|
|
224
395
|
|
|
225
396
|
Additionally, if you only want to do the update in certain cases, you can specify an
|
|
226
397
|
+:update_where+ option, which will be used as a filter. If the row doesn't match the
|
|
227
398
|
conditions, the constraint violation will be ignored, but the row will not be updated:
|
|
228
399
|
|
|
229
|
-
DB[:table].insert_conflict(
|
|
230
|
-
:
|
|
400
|
+
DB[:table].insert_conflict(constraint::table_a_uidx,
|
|
401
|
+
update: {b: Sequel[:excluded][:b]},
|
|
402
|
+
update_where: {Sequel[:table][:status_id]=>1}).insert(a: 1, b: 2)
|
|
231
403
|
# INSERT INTO TABLE (a, b) VALUES (1, 2)
|
|
232
404
|
# ON CONFLICT ON CONSTRAINT table_a_uidx
|
|
233
405
|
# DO UPDATE SET b = excluded.b WHERE (table.status_id = 1)
|
|
234
406
|
|
|
407
|
+
=== INSERT OVERRIDING SYSTEM|USER VALUE Support
|
|
408
|
+
|
|
409
|
+
PostgreSQL 10+ supports identity columns, which are designed to replace the serial
|
|
410
|
+
columns previously used for autoincrementing primary keys. You can use
|
|
411
|
+
Dataset#overriding_system_value and Dataset#overriding_user_value to use this new
|
|
412
|
+
syntax:
|
|
413
|
+
|
|
414
|
+
DB.create_table(:table){primary_key :id}
|
|
415
|
+
# Ignore the given value for id, using the identity's sequence value.
|
|
416
|
+
DB[:table].overriding_user_value.insert(:id=>1)
|
|
417
|
+
|
|
418
|
+
DB.create_table(:table){primary_key :id, :identity=>:always}
|
|
419
|
+
# Force the use of the given value for id, because otherwise the insert will
|
|
420
|
+
# raise an error, since GENERATED ALWAYS was used when creating the column.
|
|
421
|
+
DB[:table].overriding_system_value.insert(:id=>1)
|
|
422
|
+
|
|
235
423
|
=== Distinct On Specific Columns
|
|
236
424
|
|
|
237
425
|
Sequel allows passing columns to <tt>Dataset#distinct</tt>, which will make the dataset return
|
|
@@ -240,6 +428,20 @@ rows that are distinct on just those columns:
|
|
|
240
428
|
DB[:table].distinct(:id).all
|
|
241
429
|
# SELECT DISTINCT ON ("id") * FROM "table"
|
|
242
430
|
|
|
431
|
+
=== Calling PostgreSQL 11+ Procedures <tt>postgres only</tt>
|
|
432
|
+
|
|
433
|
+
PostgreSQL 11+ added support for procedures, which are different from the user defined
|
|
434
|
+
functions that PostgreSQL has historically supported. These procedures are
|
|
435
|
+
called via a special +CALL+ syntax, and Sequel supports them via
|
|
436
|
+
<tt>Database#call_procedure</tt>:
|
|
437
|
+
|
|
438
|
+
DB.call_procedure(:foo, 1, "bar")
|
|
439
|
+
# CALL foo(1, 'bar')
|
|
440
|
+
|
|
441
|
+
<tt>Database#call_procedure</tt> will return a hash of return values if
|
|
442
|
+
the procedure returns a result, or +nil+ if the procedure does not return
|
|
443
|
+
a result.
|
|
444
|
+
|
|
243
445
|
=== Using a Cursor to Process Large Datasets <tt>postgres only</tt>
|
|
244
446
|
|
|
245
447
|
The postgres adapter offers a <tt>Dataset#use_cursor</tt> method to process large result sets
|
|
@@ -258,19 +460,19 @@ without keeping all rows in memory:
|
|
|
258
460
|
This support is used by default when using <tt>Dataset#paged_each</tt>.
|
|
259
461
|
|
|
260
462
|
Using cursors, it is possible to update individual rows of a large dataset
|
|
261
|
-
easily using the <tt
|
|
463
|
+
easily using the <tt>rows_per_fetch: 1</tt> option in conjunction with
|
|
262
464
|
<tt>Dataset#where_current_of</tt>. This is useful if the logic needed to
|
|
263
465
|
update the rows exists in the application and not in the database:
|
|
264
466
|
|
|
265
|
-
ds.use_cursor(:
|
|
266
|
-
ds.where_current_of.update(:
|
|
467
|
+
ds.use_cursor(rows_per_fetch: 1).each do |row|
|
|
468
|
+
ds.where_current_of.update(col: new_col_value(row))
|
|
267
469
|
end
|
|
268
470
|
|
|
269
471
|
=== Truncate Modifiers
|
|
270
472
|
|
|
271
473
|
Sequel supports PostgreSQL-specific truncate options:
|
|
272
474
|
|
|
273
|
-
DB[:table].truncate(:
|
|
475
|
+
DB[:table].truncate(cascade: true, only: true, restart: true)
|
|
274
476
|
# TRUNCATE TABLE ONLY "table" RESTART IDENTITY CASCADE
|
|
275
477
|
|
|
276
478
|
=== COPY Support <tt>postgres/pg and jdbc/postgres only</tt>
|
|
@@ -279,14 +481,14 @@ PostgreSQL's COPY feature is pretty much the fastest way to get data in or out o
|
|
|
279
481
|
Sequel supports getting data out of the database via <tt>Database#copy_table</tt>, either for
|
|
280
482
|
a specific table or for an arbitrary dataset:
|
|
281
483
|
|
|
282
|
-
DB.copy_table(:table, :
|
|
484
|
+
DB.copy_table(:table, format: :csv)
|
|
283
485
|
# COPY "table" TO STDOUT (FORMAT csv)
|
|
284
|
-
DB.copy_table(DB[:table], :
|
|
486
|
+
DB.copy_table(DB[:table], format: :csv)
|
|
285
487
|
# COPY (SELECT * FROM "table") TO STDOUT (FORMAT csv)
|
|
286
488
|
|
|
287
489
|
It supports putting data into the database via <tt>Database#copy_into</tt>:
|
|
288
490
|
|
|
289
|
-
DB.copy_into(:table, :
|
|
491
|
+
DB.copy_into(:table, format: :csv, columns: [:column1, :column2], data: "1,2\n2,3\n")
|
|
290
492
|
# COPY "table"("column1", "column2") FROM STDIN (FORMAT csv)
|
|
291
493
|
|
|
292
494
|
=== Anonymous Function Execution
|
|
@@ -323,7 +525,7 @@ this blocks until the listening thread is notified:
|
|
|
323
525
|
Note that +listen+ by default only listens for a single notification. If you want to loop and process
|
|
324
526
|
notifications:
|
|
325
527
|
|
|
326
|
-
DB.listen(:channel, :
|
|
528
|
+
DB.listen(:channel, loop: true){|channel| p channel}
|
|
327
529
|
|
|
328
530
|
The +pg_static_cache_updater+ extension uses this support to automatically update
|
|
329
531
|
the caches for models using the +static_cache+ plugin. Look at the documentation of that
|
|
@@ -335,7 +537,7 @@ Sequel makes it easy to lock tables, though it is generally better to let the da
|
|
|
335
537
|
handle locking:
|
|
336
538
|
|
|
337
539
|
DB[:table].lock('EXCLUSIVE') do
|
|
338
|
-
DB[:table].insert(:
|
|
540
|
+
DB[:table].insert(id: DB[:table].max(:id)+1)
|
|
339
541
|
end
|
|
340
542
|
# BEGIN;
|
|
341
543
|
# LOCK TABLE "table" IN EXCLUSIVE MODE;
|
|
@@ -343,18 +545,46 @@ handle locking:
|
|
|
343
545
|
# INSERT INTO "table" ("id") VALUES (2) RETURNING NULL;
|
|
344
546
|
# COMMIT;
|
|
345
547
|
|
|
548
|
+
== Extended Error Info (<tt>postgres/pg only</tt>)
|
|
549
|
+
|
|
550
|
+
If you run a query that raises a Sequel::DatabaseError, you can pass the exception object to
|
|
551
|
+
<tt>Database#error_info</tt>, and that will return a hash with metadata regarding the error,
|
|
552
|
+
such as the related table and column or constraint.
|
|
553
|
+
|
|
554
|
+
DB.create_table(:test1){primary_key :id}
|
|
555
|
+
DB.create_table(:test2){primary_key :id; foreign_key :test1_id, :test1}
|
|
556
|
+
DB[:test2].insert(:test1_id=>1) rescue DB.error_info($!)
|
|
557
|
+
# => {
|
|
558
|
+
# :schema=>"public",
|
|
559
|
+
# :table=>"test2",
|
|
560
|
+
# :column=>nil,
|
|
561
|
+
# :constraint=>"test2_test1_id_fkey",
|
|
562
|
+
# :type=>nil,
|
|
563
|
+
# :severity=>"ERROR",
|
|
564
|
+
# :sql_state=>"23503",
|
|
565
|
+
# :message_primary=>"insert or update on table \"test2\" violates foreign key constraint \"test2_test1_id_fkey\"",
|
|
566
|
+
# :message_detail=>"Key (test1_id)=(1) is not present in table \"test1\"."
|
|
567
|
+
# :message_hint=>nil,
|
|
568
|
+
# :statement_position=>nil,
|
|
569
|
+
# :internal_position=>nil,
|
|
570
|
+
# :internal_query=>nil,
|
|
571
|
+
# :source_file=>"ri_triggers.c",
|
|
572
|
+
# :source_line=>"3321",
|
|
573
|
+
# :source_function=>"ri_ReportViolation"
|
|
574
|
+
# }
|
|
575
|
+
|
|
346
576
|
== sequel_pg (<tt>postgres/pg only</tt>)
|
|
347
577
|
|
|
348
578
|
When the postgres adapter is used with the pg driver, Sequel automatically checks for sequel_pg, and
|
|
349
579
|
loads it if it is available. sequel_pg is a C extension that optimizes the fetching of rows, generally
|
|
350
|
-
resulting in a
|
|
580
|
+
resulting in a ~2x speedup. It is highly recommended to install sequel_pg if you are using the
|
|
351
581
|
postgres adapter with pg.
|
|
352
582
|
|
|
353
|
-
sequel_pg has additional optimizations when using the Dataset +map+, +
|
|
583
|
+
sequel_pg has additional optimizations when using the Dataset +map+, +as_hash+,
|
|
354
584
|
+to_hash_groups+, +select_hash+, +select_hash_groups+, +select_map+, and +select_order_map+ methods,
|
|
355
585
|
which avoids creating intermediate hashes and can add further speedups.
|
|
356
586
|
|
|
357
|
-
In addition to optimization, sequel_pg also adds streaming support if used on PostgreSQL 9.2
|
|
587
|
+
In addition to optimization, sequel_pg also adds streaming support if used on PostgreSQL 9.2+. Streaming
|
|
358
588
|
support is similar to using a cursor, but it is faster and more transparent.
|
|
359
589
|
|
|
360
590
|
You can enable the streaming support:
|