Class: ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
- Inherits:
-
AbstractAdapter
- Object
- AbstractAdapter
- ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
- Includes:
- ActiveRecord::ConnectionAdapters::PostgreSQL::DatabaseStatements, ActiveRecord::ConnectionAdapters::PostgreSQL::Quoting, ActiveRecord::ConnectionAdapters::PostgreSQL::ReferentialIntegrity, ActiveRecord::ConnectionAdapters::PostgreSQL::SchemaStatements, ByteaDecodeDetection
- Defined in:
- activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
Overview
Active Record PostgreSQL Adapter
The PostgreSQL adapter works with the native C (github.com/ged/ruby-pg) driver.
Options
-
:host- Defaults to a Unix-domain socket in /tmp. On machines without Unix-domain sockets, the default is to connect to localhost. -
:port- Defaults to 5432. -
:username- Defaults to be the same as the operating system name of the user running the application. -
:password- Password to be used if the server demands password authentication. -
:database- Defaults to be the same as the username. -
:schema_search_path- An optional schema search path for the connection given as a string of comma-separated schema names. This is backward-compatible with the:schema_orderoption. -
:encoding- An optional client encoding that is used in aSET client_encoding TO <encoding>call on the connection. -
:min_messages- An optional client min messages that is used in aSET client_min_messages TO <min_messages>call on the connection. -
:variables- An optional hash of additional parameters that will be used inSET SESSION key = valcalls on the connection. -
:insert_returning- An optional boolean to control the use ofRETURNINGforINSERTstatements defaults to true.
Any further options are used as connection parameters to libpq. See www.postgresql.org/docs/current/static/libpq-connect.html for the list of parameters.
In addition, default connection parameters of libpq can be set per environment variables. See www.postgresql.org/docs/current/static/libpq-envars.html .
Defined Under Namespace
Modules: ByteaDecodeDetection Classes: ByteaDecoder, ByteaMarker, MoneyDecoder, StatementPool
Constant Summary collapse
- ADAPTER_NAME =
"PostgreSQL"- NATIVE_DATABASE_TYPES =
{ primary_key: "bigserial primary key", string: { name: "character varying" }, text: { name: "text" }, integer: { name: "integer", limit: 4 }, bigint: { name: "bigint" }, float: { name: "float" }, decimal: { name: "decimal" }, datetime: {}, # set dynamically based on datetime_type timestamp: { name: "timestamp" }, timestamptz: { name: "timestamptz" }, time: { name: "time" }, date: { name: "date" }, daterange: { name: "daterange" }, numrange: { name: "numrange" }, tsrange: { name: "tsrange" }, tstzrange: { name: "tstzrange" }, int4range: { name: "int4range" }, int8range: { name: "int8range" }, binary: { name: "bytea" }, boolean: { name: "boolean" }, xml: { name: "xml" }, tsvector: { name: "tsvector" }, hstore: { name: "hstore" }, inet: { name: "inet" }, cidr: { name: "cidr" }, macaddr: { name: "macaddr" }, uuid: { name: "uuid" }, json: { name: "json" }, jsonb: { name: "jsonb" }, ltree: { name: "ltree" }, citext: { name: "citext" }, point: { name: "point" }, line: { name: "line" }, lseg: { name: "lseg" }, box: { name: "box" }, path: { name: "path" }, polygon: { name: "polygon" }, circle: { name: "circle" }, bit: { name: "bit" }, bit_varying: { name: "bit varying" }, money: { name: "money" }, interval: { name: "interval" }, oid: { name: "oid" }, enum: {} # special type https://www.postgresql.org/docs/current/datatype-enum.html }
- OID =
:nodoc:
PostgreSQL::OID
Constants included from ActiveRecord::ConnectionAdapters::PostgreSQL::Quoting
ActiveRecord::ConnectionAdapters::PostgreSQL::Quoting::QUOTED_COLUMN_NAMES, ActiveRecord::ConnectionAdapters::PostgreSQL::Quoting::QUOTED_TABLE_NAMES
Constants inherited from AbstractAdapter
AbstractAdapter::COMMENT_REGEX, AbstractAdapter::EXTENDED_TYPE_MAPS, AbstractAdapter::MAX_JITTER, AbstractAdapter::SIMPLE_INT, AbstractAdapter::TYPE_MAP
Constants included from QueryCache
Constants included from ActiveSupport::Callbacks
ActiveSupport::Callbacks::CALLBACK_FILTER_TYPES
Instance Attribute Summary
Attributes inherited from AbstractAdapter
#allow_preconnect, #lock, #logger, #owner, #pinned, #pool, #visitor
Attributes included from QueryCache
Attributes included from DatabaseStatements
Class Method Summary collapse
-
.clear_type_mapping_callbacks! ⇒ Object
:nodoc:.
- .dbconsole(config, options = {}) ⇒ Object
-
.initialize_type_map(m) ⇒ Object
:nodoc:.
-
.native_database_types ⇒ Object
:nodoc:.
- .new_client(conn_params) ⇒ Object
-
.register_type_mapping(&block) ⇒ Object
Registers a callback to extend the type map during initialization.
Instance Method Summary collapse
-
#active? ⇒ Boolean
Is this connection alive and ready for queries?.
-
#add_enum_value(type_name, value, **options) ⇒ Object
Add enum value to an existing enum type.
-
#build_insert_sql(insert) ⇒ Object
:nodoc:.
-
#check_version ⇒ Object
:nodoc:.
- #clear_cache!(new_connection: false) ⇒ Object
- #connected? ⇒ Boolean
-
#create_enum(name, values, **options) ⇒ Object
Given a name and an array of values, creates an enum type.
-
#create_unlogged_tables ⇒ Object
:singleton-method: PostgreSQL allows the creation of “unlogged” tables, which do not record data in the PostgreSQL Write-Ahead Log.
-
#datetime_type ⇒ Object
:singleton-method: PostgreSQL supports multiple types for DateTimes.
-
#decode_bytea ⇒ Object
:singleton-method: Toggles automatic decoding of bytea columns.
-
#decode_dates ⇒ Object
:singleton-method: Toggles automatic decoding of date columns.
-
#decode_money ⇒ Object
:singleton-method: Toggles automatic decoding of money columns.
-
#default_index_type?(index) ⇒ Boolean
:nodoc:.
-
#disable_extension(name, force: false) ⇒ Object
Removes an extension from the database.
-
#discard! ⇒ Object
:nodoc:.
-
#disconnect! ⇒ Object
Disconnects from the database if already connected.
-
#drop_enum(name, values = nil, **options) ⇒ Object
Drops an enum type.
- #enable_extension(name) ⇒ Object
-
#enum_types ⇒ Object
Returns a list of defined enum types, and their values.
- #extension_available?(name) ⇒ Boolean
- #extension_enabled?(name) ⇒ Boolean
- #extensions ⇒ Object
-
#get_advisory_lock(lock_id) ⇒ Object
:nodoc:.
-
#get_database_version ⇒ Object
Returns the version of the connected PostgreSQL server.
- #index_algorithms ⇒ Object
-
#initialize ⇒ PostgreSQLAdapter
constructor
Initializes and connects a PostgreSQL adapter.
-
#max_identifier_length ⇒ Object
Returns the configured maximum supported identifier length supported by PostgreSQL.
-
#release_advisory_lock(lock_id) ⇒ Object
:nodoc:.
-
#reload_type_map ⇒ Object
:nodoc:.
-
#rename_enum(name, new_name = nil, **options) ⇒ Object
Rename an existing enum type to something else.
-
#rename_enum_value(type_name, **options) ⇒ Object
Rename enum value on an existing enum type.
- #reset! ⇒ Object
-
#session_auth=(user) ⇒ Object
Set the authorized user for this session.
- #set_standard_conforming_strings ⇒ Object
- #supports_advisory_locks? ⇒ Boolean
- #supports_bulk_alter? ⇒ Boolean
- #supports_check_constraints? ⇒ Boolean
-
#supports_close_prepared? ⇒ Boolean
:nodoc:.
- #supports_comments? ⇒ Boolean
- #supports_common_table_expressions? ⇒ Boolean
- #supports_datetime_with_precision? ⇒ Boolean
- #supports_ddl_transactions? ⇒ Boolean
- #supports_deferrable_constraints? ⇒ Boolean
- #supports_exclusion_constraints? ⇒ Boolean
- #supports_explain? ⇒ Boolean
- #supports_expression_index? ⇒ Boolean
- #supports_extensions? ⇒ Boolean
-
#supports_force_drop_database? ⇒ Boolean
:nodoc:.
- #supports_foreign_keys? ⇒ Boolean
- #supports_foreign_tables? ⇒ Boolean
-
#supports_identity_columns? ⇒ Boolean
:nodoc:.
- #supports_index_include? ⇒ Boolean
- #supports_index_sort_order? ⇒ Boolean
- #supports_insert_on_conflict? ⇒ Boolean (also: #supports_insert_on_duplicate_skip?, #supports_insert_on_duplicate_update?, #supports_insert_conflict_target?)
- #supports_insert_returning? ⇒ Boolean
- #supports_json? ⇒ Boolean
- #supports_lazy_transactions? ⇒ Boolean
- #supports_materialized_views? ⇒ Boolean
-
#supports_native_partitioning? ⇒ Boolean
:nodoc:.
- #supports_nulls_not_distinct? ⇒ Boolean
- #supports_optimizer_hints? ⇒ Boolean
- #supports_partial_index? ⇒ Boolean
- #supports_partitioned_indexes? ⇒ Boolean
- #supports_pgcrypto_uuid? ⇒ Boolean
- #supports_restart_db_transaction? ⇒ Boolean
- #supports_savepoints? ⇒ Boolean
- #supports_transaction_isolation? ⇒ Boolean
- #supports_unique_constraints? ⇒ Boolean
- #supports_validate_constraints? ⇒ Boolean
- #supports_views? ⇒ Boolean
- #supports_virtual_columns? ⇒ Boolean
- #use_insert_returning? ⇒ Boolean
Methods included from ActiveRecord::ConnectionAdapters::PostgreSQL::DatabaseStatements
#_exec_insert, #begin_db_transaction, #begin_isolated_db_transaction, #build_explain_clause, #commit_db_transaction, #exec_restart_db_transaction, #exec_rollback_db_transaction, #execute, #execute_batch, #explain, #high_precision_current_timestamp, #query_rows, #set_constraints, #write_query?
Methods included from ActiveRecord::ConnectionAdapters::PostgreSQL::SchemaStatements
#add_column, #add_exclusion_constraint, #add_foreign_key, #add_index, #add_index_options, #add_unique_constraint, #build_change_column_default_definition, #build_change_column_definition, #build_create_index_definition, #change_column, #change_column_comment, #change_column_default, #change_column_null, #change_table_comment, #check_constraints, #client_min_messages, #client_min_messages=, #collation, #columns_for_distinct, #create_database, #create_schema, #create_schema_dumper, #ctype, #current_database, #current_schema, #current_schemas, #default_sequence_name, #drop_database, #drop_schema, #drop_table, #encoding, #exclusion_constraint_options, #exclusion_constraints, #foreign_key_column_for, #foreign_keys, #foreign_table_exists?, #foreign_tables, #index_name, #index_name_exists?, #indexes, #inherited_table_names, #pk_and_sequence_for, #primary_keys, #quoted_include_columns_for_index, #recreate_database, #remove_exclusion_constraint, #remove_index, #remove_unique_constraint, #rename_column, #rename_index, #rename_schema, #rename_table, #reset_column_sequences!, #reset_pk_sequence!, #schema_creation, #schema_exists?, #schema_names, #schema_search_path, #schema_search_path=, #serial_sequence, #set_pk_sequence!, #table_comment, #table_options, #table_partition_definition, #type_to_sql, #unique_constraint_options, #unique_constraints, #update_table_definition, #validate_check_constraint, #validate_constraint, #validate_foreign_key
Methods included from ActiveRecord::ConnectionAdapters::PostgreSQL::ReferentialIntegrity
#check_all_foreign_keys_valid!, #disable_referential_integrity
Methods included from ActiveRecord::ConnectionAdapters::PostgreSQL::Quoting
#check_int_in_range, #escape_bytea, #lookup_cast_type, #quote, #quote_default_expression, #quote_schema_name, #quote_string, #quote_table_name_for_assignment, #quoted_binary, #quoted_date, #type_cast, #unescape_bytea
Methods included from ActiveSupport::Concern
#append_features, #class_methods, extended, #included, #prepend_features, #prepended
Methods included from ByteaDecodeDetection
Methods inherited from AbstractAdapter
#adapter_name, #advisory_locks_enabled?, #async_enabled?, build_read_query_regexp, #case_insensitive_comparison, #case_sensitive_comparison, #check_all_foreign_keys_valid!, #clean!, #close, #connect!, #connection_age, #connection_descriptor, #connection_retries, #create_virtual_table, #database_exists?, database_exists?, #database_version, #default_timezone, #disable_referential_integrity, #drop_virtual_table, #expire, extended_type_map, find_cmd_and_exec, #force_retirement, #inspect, #lease, #lock_thread=, #max_jitter, #migration_strategy, #native_database_types, #pool_jitter, #prefetch_primary_key?, #prepared_statements?, #prepared_statements_disabled_cache, #preventing_writes?, #raw_connection, #reconnect!, register_class_with_precision, #replica?, #requires_reloading?, #retry_deadline, #return_value_after_insert?, #role, #savepoint_errors_invalidate_transactions?, #schema_cache, #schema_version, #seconds_idle, #seconds_since_last_activity, #shard, #steal!, #supports_comments_in_create?, #supports_concurrent_connections?, #supports_disabling_indexes?, #supports_indexes_in_create?, #throw_away!, type_cast_config_to_boolean, type_cast_config_to_integer, #unprepared_statement, #valid_type?, valid_type?, validate_default_timezone, #verified?, #verify!, #verify_timeout
Methods included from Savepoints
#create_savepoint, #current_savepoint_name, #exec_rollback_to_savepoint, #release_savepoint
Methods included from QueryCache
#cache, #clear_query_cache, dirties_query_cache, #disable_query_cache!, #enable_query_cache!, included, #query_cache_enabled, #select_all, #uncached
Methods included from DatabaseLimits
#index_name_length, #table_alias_length, #table_name_length
Methods included from Quoting
#cast_bound_value, #lookup_cast_type, #quote, #quote_column_name, #quote_default_expression, #quote_string, #quote_table_name, #quote_table_name_for_assignment, #quoted_binary, #quoted_date, #quoted_false, #quoted_time, #quoted_true, #sanitize_as_sql_comment, #type_cast, #type_casted_binds, #unquoted_false, #unquoted_true
Methods included from DatabaseStatements
#_exec_insert, #add_transaction_record, #begin_db_transaction, #begin_deferred_transaction, #begin_isolated_db_transaction, #cacheable_query, #commit_db_transaction, #default_insert_value, #default_sequence_name, #delete, #empty_all_tables, #empty_insert_statement_value, #exec_delete, #exec_insert, #exec_insert_all, #exec_query, #exec_restart_db_transaction, #exec_rollback_db_transaction, #exec_update, #execute, #execute_batch, #execute_intent, #explain, #high_precision_current_timestamp, #insert, #insert_fixture, #insert_fixtures_set, #query_all, #query_command, #query_one, #query_rows, #query_value, #query_values, #reset_isolation_level, #reset_sequence!, #reset_transaction, #restart_db_transaction, #rollback_db_transaction, #rollback_to_savepoint, #select_all, #select_one, #select_rows, #select_value, #select_values, #to_sql, #to_sql_and_binds, #transaction, #transaction_isolation_levels, #transaction_open?, #truncate, #truncate_tables, #update, #with_yaml_fallback, #write_query?
Methods included from SchemaStatements
#add_check_constraint, #add_column, #add_columns, #add_foreign_key, #add_index, #add_index_options, #add_reference, #add_timestamps, #assume_migrated_upto_version, #build_add_column_definition, #build_change_column_default_definition, #build_create_index_definition, #build_create_join_table_definition, #build_create_table_definition, #bulk_change_table, #change_column, #change_column_comment, #change_column_default, #change_column_null, #change_table, #change_table_comment, #check_constraint_exists?, #check_constraint_options, #check_constraints, #column_exists?, #columns, #columns_for_distinct, #create_join_table, #create_schema_dumper, #create_table, #data_source_exists?, #data_sources, #disable_index, #distinct_relation_for_primary_key, #drop_join_table, #drop_table, #dump_schema_versions, #enable_index, #foreign_key_column_for, #foreign_key_exists?, #foreign_key_options, #foreign_keys, #index_algorithm, #index_exists?, #index_name, #index_name_exists?, #indexes, #internal_string_options_for_primary_key, #max_index_name_size, #native_database_types, #options_include_default?, #primary_key, #quoted_columns_for_index, #remove_check_constraint, #remove_column, #remove_columns, #remove_constraint, #remove_foreign_key, #remove_index, #remove_reference, #remove_timestamps, #rename_column, #rename_index, #rename_table, #schema_creation, #table_alias_for, #table_comment, #table_exists?, #table_options, #tables, #type_to_sql, #update_table_definition, #use_foreign_keys?, #valid_column_definition_options, #valid_primary_key_options, #valid_table_definition_options, #view_exists?, #views
Methods included from ActiveSupport::Callbacks
Constructor Details
#initialize ⇒ PostgreSQLAdapter
Initializes and connects a PostgreSQL adapter.
352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 352 def initialize(...) super conn_params = @config.compact # Map ActiveRecords param names to PGs. conn_params[:user] = conn_params.delete(:username) if conn_params[:username] conn_params[:dbname] = conn_params.delete(:database) if conn_params[:database] # Forward only valid config params to PG::Connection.connect. valid_conn_param_keys = PG::Connection.conndefaults_hash.keys + [:requiressl] conn_params.slice!(*valid_conn_param_keys) @connection_parameters = conn_params @max_identifier_length = nil @type_map = nil @raw_connection = nil @notice_receiver_sql_warnings = [] @use_insert_returning = @config.key?(:insert_returning) ? self.class.type_cast_config_to_boolean(@config[:insert_returning]) : true end |
Class Method Details
.clear_type_mapping_callbacks! ⇒ Object
:nodoc:
794 795 796 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 794 def clear_type_mapping_callbacks! # :nodoc: @@type_mapping_callbacks = [] if defined?(@@type_mapping_callbacks) end |
.dbconsole(config, options = {}) ⇒ Object
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 73 def dbconsole(config, = {}) pg_config = config.configuration_hash ENV["PGUSER"] = pg_config[:username] if pg_config[:username] ENV["PGHOST"] = pg_config[:host] if pg_config[:host] ENV["PGPORT"] = pg_config[:port].to_s if pg_config[:port] ENV["PGPASSWORD"] = pg_config[:password].to_s if pg_config[:password] && [:include_password] ENV["PGSSLMODE"] = pg_config[:sslmode].to_s if pg_config[:sslmode] ENV["PGSSLCERT"] = pg_config[:sslcert].to_s if pg_config[:sslcert] ENV["PGSSLKEY"] = pg_config[:sslkey].to_s if pg_config[:sslkey] ENV["PGSSLROOTCERT"] = pg_config[:sslrootcert].to_s if pg_config[:sslrootcert] if pg_config[:variables] ENV["PGOPTIONS"] = pg_config[:variables].filter_map do |name, value| "-c #{name}=#{value.to_s.gsub(/[ \\]/, '\\\\\0')}" unless value == ":default" || value == :default end.join(" ") end find_cmd_and_exec(ActiveRecord.database_cli[:postgresql], config.database) end |
.initialize_type_map(m) ⇒ Object
:nodoc:
715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 715 def initialize_type_map(m) # :nodoc: m.register_type "int2", Type::Integer.new(limit: 2) m.register_type "int4", Type::Integer.new(limit: 4) m.register_type "int8", Type::Integer.new(limit: 8) m.register_type "oid", OID::Oid.new m.register_type "float4", Type::Float.new(limit: 24) m.register_type "float8", Type::Float.new m.register_type "text", Type::Text.new register_class_with_limit m, "varchar", Type::String m.alias_type "char", "varchar" m.alias_type "name", "varchar" m.alias_type "bpchar", "varchar" m.register_type "bool", Type::Boolean.new register_class_with_limit m, "bit", OID::Bit register_class_with_limit m, "varbit", OID::BitVarying m.register_type "date", OID::Date.new m.register_type "money", OID::Money.new m.register_type "bytea", OID::Bytea.new m.register_type "point", OID::Point.new m.register_type "hstore", OID::Hstore.new m.register_type "json", Type::Json.new m.register_type "jsonb", OID::Jsonb.new m.register_type "cidr", OID::Cidr.new m.register_type "inet", OID::Inet.new m.register_type "uuid", OID::Uuid.new m.register_type "xml", OID::Xml.new m.register_type "tsvector", OID::SpecializedString.new(:tsvector) m.register_type "macaddr", OID::Macaddr.new m.register_type "citext", OID::SpecializedString.new(:citext) m.register_type "ltree", OID::SpecializedString.new(:ltree) m.register_type "line", OID::SpecializedString.new(:line) m.register_type "lseg", OID::SpecializedString.new(:lseg) m.register_type "box", OID::SpecializedString.new(:box) m.register_type "path", OID::SpecializedString.new(:path) m.register_type "polygon", OID::SpecializedString.new(:polygon) m.register_type "circle", OID::SpecializedString.new(:circle) m.register_type "numeric" do |_, fmod, sql_type| precision = extract_precision(sql_type) scale = extract_scale(sql_type) # The type for the numeric depends on the width of the field, # so we'll do something special here. # # When dealing with decimal columns: # # places after decimal = fmod - 4 & 0xffff # places before decimal = (fmod - 4) >> 16 & 0xffff if fmod && (fmod - 4 & 0xffff).zero? # FIXME: Remove this class, and the second argument to # lookups on PG Type::DecimalWithoutScale.new(precision: precision) else OID::Decimal.new(precision: precision, scale: scale) end end m.register_type "interval" do |*args, sql_type| precision = extract_precision(sql_type) OID::Interval.new(precision: precision) end end |
.native_database_types ⇒ Object
:nodoc:
437 438 439 440 441 442 443 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 437 def self.native_database_types # :nodoc: @native_database_types ||= begin types = NATIVE_DATABASE_TYPES.dup types[:datetime] = types[datetime_type] types end end |
.new_client(conn_params) ⇒ Object
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 57 def new_client(conn_params) PG.connect(**conn_params) rescue ::PG::Error => error if conn_params && conn_params[:dbname] == "postgres" raise ActiveRecord::ConnectionNotEstablished, error. elsif conn_params && conn_params[:dbname] && error..include?(conn_params[:dbname]) raise ActiveRecord::NoDatabaseError.db_error(conn_params[:dbname]) elsif conn_params && conn_params[:user] && error..include?(conn_params[:user]) raise ActiveRecord::DatabaseConnectionError.username_error(conn_params[:user]) elsif conn_params && conn_params[:host] && error..include?(conn_params[:host]) raise ActiveRecord::DatabaseConnectionError.hostname_error(conn_params[:host]) else raise ActiveRecord::ConnectionNotEstablished, error. end end |
.register_type_mapping(&block) ⇒ Object
Registers a callback to extend the type map during initialization. Useful for third-party gems that need to register custom SQL types.
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.register_type_mapping do |type_map|
type_map.register_type("geometry") do |oid, fmod, sql_type|
MyGeometryType.new(sql_type)
end
end
788 789 790 791 792 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 788 def register_type_mapping(&block) raise ArgumentError, "block required" unless block_given? @@type_mapping_callbacks = [] unless defined?(@@type_mapping_callbacks) @@type_mapping_callbacks << block end |
Instance Method Details
#active? ⇒ Boolean
Is this connection alive and ready for queries?
380 381 382 383 384 385 386 387 388 389 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 380 def active? @lock.synchronize do return false unless connected? @raw_connection.query ";" verified! end true rescue PG::Error false end |
#add_enum_value(type_name, value, **options) ⇒ Object
Add enum value to an existing enum type.
627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 627 def add_enum_value(type_name, value, **) before, after = .values_at(:before, :after) sql = +"ALTER TYPE #{quote_table_name(type_name)} ADD VALUE" sql << " IF NOT EXISTS" if [:if_not_exists] sql << " #{quote(value)}" if before && after raise ArgumentError, "Cannot have both :before and :after at the same time" elsif before sql << " BEFORE #{quote(before)}" elsif after sql << " AFTER #{quote(after)}" end execute(sql).tap { reload_type_map } end |
#build_insert_sql(insert) ⇒ Object
:nodoc:
689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 689 def build_insert_sql(insert) # :nodoc: sql = +"INSERT #{insert.into} #{insert.values_list}" if insert.skip_duplicates? sql << " ON CONFLICT #{insert.conflict_target} DO NOTHING" elsif insert.update_duplicates? sql << " ON CONFLICT #{insert.conflict_target} DO UPDATE SET " if insert.raw_update_sql? sql << insert.raw_update_sql else sql << insert. { |column| "#{insert.model.quoted_table_name}.#{column} IS NOT DISTINCT FROM excluded.#{column}" } sql << insert.updatable_columns.map { |column| "#{column}=excluded.#{column}" }.join(",") end end sql << " RETURNING #{insert.returning}" if insert.returning sql end |
#check_version ⇒ Object
:nodoc:
708 709 710 711 712 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 708 def check_version # :nodoc: if database_version < 9_03_00 # < 9.3 raise "Your version of PostgreSQL (#{database_version}) is too old. Active Record supports PostgreSQL >= 9.3." end end |
#clear_cache!(new_connection: false) ⇒ Object
416 417 418 419 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 416 def clear_cache!(new_connection: false) super @schema_search_path = nil if new_connection end |
#connected? ⇒ Boolean
375 376 377 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 375 def connected? !(@raw_connection.nil? || @raw_connection.finished? || @raw_connection.status != PG::CONNECTION_OK) end |
#create_enum(name, values, **options) ⇒ Object
Given a name and an array of values, creates an enum type.
578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 578 def create_enum(name, values, **) sql_values = values.map { |s| quote(s) }.join(", ") scope = quoted_scope(name) query = <<~SQL DO $$ BEGIN IF NOT EXISTS ( SELECT 1 FROM pg_type t JOIN pg_namespace n ON t.typnamespace = n.oid WHERE t.typname = #{scope[:name]} AND n.nspname = #{scope[:schema]} ) THEN CREATE TYPE #{quote_table_name(name)} AS ENUM (#{sql_values}); END IF; END $$; SQL query_command(query) reload_type_map end |
#create_unlogged_tables ⇒ Object
:singleton-method: PostgreSQL allows the creation of “unlogged” tables, which do not record data in the PostgreSQL Write-Ahead Log. This can make the tables faster, but significantly increases the risk of data loss if the database crashes. As a result, this should not be used in production environments. If you would like all created tables to be unlogged in the test environment you can add the following to your test.rb file:
ActiveSupport.on_load(:active_record_postgresqladapter) do
self.create_unlogged_tables = true
end
105 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 105 class_attribute :create_unlogged_tables, default: false |
#datetime_type ⇒ Object
:singleton-method: PostgreSQL supports multiple types for DateTimes. By default, if you use datetime in migrations, Rails will translate this to a PostgreSQL “timestamp without time zone”. Change this in an initializer to use another NATIVE_DATABASE_TYPES. For example, to store DateTimes as “timestamp with time zone”:
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.datetime_type = :timestamptz
Or if you are adding a custom type:
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::NATIVE_DATABASE_TYPES[:my_custom_type] = { name: "my_custom_type_name" }
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.datetime_type = :my_custom_type
If you’re using :ruby as your config.active_record.schema_format and you change this setting, you should immediately run bin/rails db:migrate to update the types in your schema.rb.
123 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 123 class_attribute :datetime_type, default: :timestamp |
#decode_bytea ⇒ Object
:singleton-method: Toggles automatic decoding of bytea columns.
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.select_value("select '\\x48656c6c6f'::bytea").class #=> String
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.decode_bytea = true
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.select_value("select '\\x48656c6c6f'::bytea").encoding #=> Encoding::BINARY
150 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 150 class_attribute :decode_bytea, default: false |
#decode_dates ⇒ Object
:singleton-method: Toggles automatic decoding of date columns.
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.select_value("select '2024-01-01'::date").class #=> String
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.decode_dates = true
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.select_value("select '2024-01-01'::date").class #=> Date
132 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 132 class_attribute :decode_dates, default: false |
#decode_money ⇒ Object
:singleton-method: Toggles automatic decoding of money columns.
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.select_value("select '12.34'::money").class #=> String
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.decode_money = true
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.select_value("select '12.34'::money").class #=> BigDecimal
141 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 141 class_attribute :decode_money, default: false |
#default_index_type?(index) ⇒ Boolean
:nodoc:
685 686 687 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 685 def default_index_type?(index) # :nodoc: index.using == :btree || super end |
#disable_extension(name, force: false) ⇒ Object
Removes an extension from the database.
:force-
Set to
:cascadeto drop dependent objects as well. Defaults to false.
524 525 526 527 528 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 524 def disable_extension(name, force: false) _schema, name = name.to_s.split(".").values_at(-2, -1) query_command("DROP EXTENSION IF EXISTS \"#{name}\"#{' CASCADE' if force == :cascade}") reload_type_map end |
#discard! ⇒ Object
:nodoc:
431 432 433 434 435 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 431 def discard! # :nodoc: super @raw_connection&.socket_io&.reopen(IO::NULL) rescue nil @raw_connection = nil end |
#disconnect! ⇒ Object
Disconnects from the database if already connected. Otherwise, this method does nothing.
423 424 425 426 427 428 429 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 423 def disconnect! @lock.synchronize do super @raw_connection&.close rescue nil @raw_connection = nil end end |
#drop_enum(name, values = nil, **options) ⇒ Object
Drops an enum type.
If the if_exists: true option is provided, the enum is dropped only if it exists. Otherwise, if the enum doesn’t exist, an error is raised.
The values parameter will be ignored if present. It can be helpful to provide this in a migration’s change method so it can be reverted. In that case, values will be used by #create_enum.
609 610 611 612 613 614 615 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 609 def drop_enum(name, values = nil, **) query = <<~SQL DROP TYPE#{' IF EXISTS' if [:if_exists]} #{quote_table_name(name)}; SQL query_command(query) reload_type_map end |
#enable_extension(name) ⇒ Object
510 511 512 513 514 515 516 517 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 510 def enable_extension(name, **) schema, name = name.to_s.split(".").values_at(-2, -1) sql = +"CREATE EXTENSION IF NOT EXISTS \"#{name}\"" sql << " SCHEMA #{schema}" if schema query_command(sql) reload_type_map end |
#enum_types ⇒ Object
Returns a list of defined enum types, and their values.
555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 555 def enum_types query = <<~SQL SELECT type.typname AS name, type.OID AS oid, n.nspname AS schema, array_agg(enum.enumlabel ORDER BY enum.enumsortorder) AS value FROM pg_enum AS enum JOIN pg_type AS type ON (type.oid = enum.enumtypid) JOIN pg_namespace n ON type.typnamespace = n.oid WHERE n.nspname = ANY (current_schemas(false)) GROUP BY type.OID, n.nspname, type.typname; SQL query_all(query).cast_values.each_with_object({}) do |row, memo| name, schema = row[0], row[2] schema = nil if schema == current_schema full_name = [schema, name].compact.join(".") memo[full_name] = row.last end.to_a end |
#extension_available?(name) ⇒ Boolean
530 531 532 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 530 def extension_available?(name) query_value("SELECT true FROM pg_available_extensions WHERE name = #{quote(name)}") end |
#extension_enabled?(name) ⇒ Boolean
534 535 536 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 534 def extension_enabled?(name) query_value("SELECT installed_version IS NOT NULL FROM pg_available_extensions WHERE name = #{quote(name)}") end |
#extensions ⇒ Object
538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 538 def extensions query = <<~SQL SELECT pg_extension.extname, n.nspname AS schema FROM pg_extension JOIN pg_namespace n ON pg_extension.extnamespace = n.oid SQL query_all(query).cast_values.map do |row| name, schema = row[0], row[1] schema = nil if schema == current_schema [schema, name].compact.join(".") end end |
#get_advisory_lock(lock_id) ⇒ Object
:nodoc:
496 497 498 499 500 501 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 496 def get_advisory_lock(lock_id) # :nodoc: unless lock_id.is_a?(Integer) && lock_id.bit_length <= 63 raise(ArgumentError, "PostgreSQL requires advisory lock ids to be a signed 64 bit integer") end query_value("SELECT pg_try_advisory_lock(#{lock_id})", nil, materialize_transactions: true) end |
#get_database_version ⇒ Object
Returns the version of the connected PostgreSQL server.
674 675 676 677 678 679 680 681 682 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 674 def get_database_version # :nodoc: with_raw_connection do |conn| version = conn.server_version if version == 0 raise ActiveRecord::ConnectionNotEstablished, "Could not determine PostgreSQL version" end version end end |
#index_algorithms ⇒ Object
319 320 321 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 319 def index_algorithms { concurrently: "CONCURRENTLY" } end |
#max_identifier_length ⇒ Object
Returns the configured maximum supported identifier length supported by PostgreSQL
659 660 661 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 659 def max_identifier_length @max_identifier_length ||= query_value("SHOW max_identifier_length").to_i end |
#release_advisory_lock(lock_id) ⇒ Object
:nodoc:
503 504 505 506 507 508 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 503 def release_advisory_lock(lock_id) # :nodoc: unless lock_id.is_a?(Integer) && lock_id.bit_length <= 63 raise(ArgumentError, "PostgreSQL requires advisory lock ids to be a signed 64 bit integer") end query_value("SELECT pg_advisory_unlock(#{lock_id})", nil, materialize_transactions: true) end |
#reload_type_map ⇒ Object
:nodoc:
391 392 393 394 395 396 397 398 399 400 401 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 391 def reload_type_map # :nodoc: @lock.synchronize do if @type_map type_map.clear else @type_map = Type::HashLookupTypeMap.new end initialize_type_map end end |
#rename_enum(name, new_name = nil, **options) ⇒ Object
Rename an existing enum type to something else.
618 619 620 621 622 623 624 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 618 def rename_enum(name, new_name = nil, **) new_name ||= .fetch(:to) do raise ArgumentError, "rename_enum requires two from/to name positional arguments." end exec_query("ALTER TYPE #{quote_table_name(name)} RENAME TO #{quote_table_name(new_name)}").tap { reload_type_map } end |
#rename_enum_value(type_name, **options) ⇒ Object
Rename enum value on an existing enum type.
645 646 647 648 649 650 651 652 653 654 655 656 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 645 def rename_enum_value(type_name, **) unless database_version >= 10_00_00 # >= 10.0 raise ArgumentError, "Renaming enum values is only supported in PostgreSQL 10 or later" end from = .fetch(:from) { raise ArgumentError, ":from is required" } to = .fetch(:to) { raise ArgumentError, ":to is required" } execute("ALTER TYPE #{quote_table_name(type_name)} RENAME VALUE #{quote(from)} TO #{quote(to)}").tap { reload_type_map } end |
#reset! ⇒ Object
403 404 405 406 407 408 409 410 411 412 413 414 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 403 def reset! @lock.synchronize do return connect! unless @raw_connection unless @raw_connection.transaction_status == ::PG::PQTRANS_IDLE @raw_connection.query "ROLLBACK" end @raw_connection.query "DISCARD ALL" super end end |
#session_auth=(user) ⇒ Object
Set the authorized user for this session
664 665 666 667 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 664 def session_auth=(user) clear_cache! query_command("SET SESSION AUTHORIZATION #{user}", nil, materialize_transactions: true) end |
#set_standard_conforming_strings ⇒ Object
445 446 447 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 445 def set_standard_conforming_strings query_command("SET standard_conforming_strings = on", "SCHEMA") end |
#supports_advisory_locks? ⇒ Boolean
453 454 455 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 453 def supports_advisory_locks? true end |
#supports_bulk_alter? ⇒ Boolean
206 207 208 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 206 def supports_bulk_alter? true end |
#supports_check_constraints? ⇒ Boolean
238 239 240 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 238 def supports_check_constraints? true end |
#supports_close_prepared? ⇒ Boolean
:nodoc:
310 311 312 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 310 def supports_close_prepared? # :nodoc: database_version >= 17_00_00 end |
#supports_comments? ⇒ Boolean
270 271 272 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 270 def supports_comments? true end |
#supports_common_table_expressions? ⇒ Boolean
484 485 486 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 484 def supports_common_table_expressions? true end |
#supports_datetime_with_precision? ⇒ Boolean
262 263 264 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 262 def supports_datetime_with_precision? true end |
#supports_ddl_transactions? ⇒ Boolean
449 450 451 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 449 def supports_ddl_transactions? true end |
#supports_deferrable_constraints? ⇒ Boolean
254 255 256 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 254 def supports_deferrable_constraints? true end |
#supports_exclusion_constraints? ⇒ Boolean
242 243 244 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 242 def supports_exclusion_constraints? true end |
#supports_explain? ⇒ Boolean
457 458 459 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 457 def supports_explain? true end |
#supports_expression_index? ⇒ Boolean
226 227 228 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 226 def supports_expression_index? true end |
#supports_extensions? ⇒ Boolean
461 462 463 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 461 def supports_extensions? true end |
#supports_force_drop_database? ⇒ Boolean
:nodoc:
492 493 494 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 492 def supports_force_drop_database? # :nodoc: database_version >= 13_00_00 # >= 13.0 end |
#supports_foreign_keys? ⇒ Boolean
234 235 236 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 234 def supports_foreign_keys? true end |
#supports_foreign_tables? ⇒ Boolean
469 470 471 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 469 def supports_foreign_tables? true end |
#supports_identity_columns? ⇒ Boolean
:nodoc:
297 298 299 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 297 def supports_identity_columns? # :nodoc: database_version >= 10_00_00 # >= 10.0 end |
#supports_index_include? ⇒ Boolean
222 223 224 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 222 def supports_index_include? database_version >= 11_00_00 # >= 11.0 end |
#supports_index_sort_order? ⇒ Boolean
210 211 212 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 210 def supports_index_sort_order? true end |
#supports_insert_on_conflict? ⇒ Boolean Also known as: supports_insert_on_duplicate_skip?, supports_insert_on_duplicate_update?, supports_insert_conflict_target?
286 287 288 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 286 def supports_insert_on_conflict? database_version >= 9_05_00 # >= 9.5 end |
#supports_insert_returning? ⇒ Boolean
282 283 284 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 282 def supports_insert_returning? true end |
#supports_json? ⇒ Boolean
266 267 268 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 266 def supports_json? true end |
#supports_lazy_transactions? ⇒ Boolean
488 489 490 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 488 def supports_lazy_transactions? true end |
#supports_materialized_views? ⇒ Boolean
465 466 467 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 465 def supports_materialized_views? true end |
#supports_native_partitioning? ⇒ Boolean
:nodoc:
305 306 307 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 305 def supports_native_partitioning? # :nodoc: database_version >= 10_00_00 # >= 10.0 end |
#supports_nulls_not_distinct? ⇒ Boolean
301 302 303 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 301 def supports_nulls_not_distinct? database_version >= 15_00_00 # >= 15.0 end |
#supports_optimizer_hints? ⇒ Boolean
477 478 479 480 481 482 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 477 def supports_optimizer_hints? unless defined?(@has_pg_hint_plan) @has_pg_hint_plan = extension_available?("pg_hint_plan") end @has_pg_hint_plan end |
#supports_partial_index? ⇒ Boolean
218 219 220 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 218 def supports_partial_index? true end |
#supports_partitioned_indexes? ⇒ Boolean
214 215 216 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 214 def supports_partitioned_indexes? database_version >= 11_00_00 # >= 11.0 end |
#supports_pgcrypto_uuid? ⇒ Boolean
473 474 475 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 473 def supports_pgcrypto_uuid? database_version >= 9_04_00 # >= 9.4 end |
#supports_restart_db_transaction? ⇒ Boolean
278 279 280 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 278 def supports_restart_db_transaction? database_version >= 12_00_00 # >= 12.0 end |
#supports_savepoints? ⇒ Boolean
274 275 276 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 274 def supports_savepoints? true end |
#supports_transaction_isolation? ⇒ Boolean
230 231 232 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 230 def supports_transaction_isolation? true end |
#supports_unique_constraints? ⇒ Boolean
246 247 248 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 246 def supports_unique_constraints? true end |
#supports_validate_constraints? ⇒ Boolean
250 251 252 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 250 def supports_validate_constraints? true end |
#supports_views? ⇒ Boolean
258 259 260 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 258 def supports_views? true end |
#supports_virtual_columns? ⇒ Boolean
293 294 295 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 293 def supports_virtual_columns? database_version >= 12_00_00 # >= 12.0 end |
#use_insert_returning? ⇒ Boolean
669 670 671 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 669 def use_insert_returning? @use_insert_returning end |