sequel 4.49.0 → 5.0.0

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