Class: ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
Relationships & Source Files | |
Namespace Children | |
Classes:
| |
Super Chains via Extension / Inclusion / Inheritance | |
Class Chain:
|
|
Instance Chain:
|
|
Inherits: |
ActiveRecord::ConnectionAdapters::AbstractAdapter
|
Defined in: | activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb |
Overview
The PostgreSQL adapter works with the native C (bitbucket.org/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 user name. -
: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_order
option. -
: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 = val
calls on the connection. -
:insert_returning
- An optional boolean to control the use ofRETURNING
forINSERT
statements defaults to true.
Any further options are used as connection parameters to libpq. See www.postgresql.org/docs/9.1/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/9.1/static/libpq-envars.html .
Constant Summary
-
ADAPTER_NAME =
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 77'PostgreSQL'.freeze
-
FOREIGN_KEY_VIOLATION =
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 411
"23503"
-
NATIVE_DATABASE_TYPES =
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 79{ primary_key: "serial primary key", bigserial: "bigserial", string: { name: "character varying" }, text: { name: "text" }, integer: { name: "integer" }, float: { name: "float" }, decimal: { name: "decimal" }, datetime: { name: "timestamp" }, 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" }, bigint: { name: "bigint" }, 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" }, bit: { name: "bit" }, bit_varying: { name: "bit varying" }, money: { name: "money" }, }
-
UNIQUE_VIOLATION =
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 412"23505"
::ActiveSupport::Callbacks - Included
AbstractAdapter - Inherited
Class Method Summary
-
.new(connection, logger, connection_parameters, config) ⇒ PostgreSQLAdapter
constructor
Initializes and connects a PostgreSQL adapter.
AbstractAdapter - Inherited
::ActiveSupport::DescendantsTracker - Inherited
clear, descendants, direct_descendants, | |
store_inherited | This is the only method that is not thread safe, but is only ever called during the eager loading phase. |
Instance Attribute Summary
-
#active? ⇒ Boolean
readonly
Is this connection alive and ready for queries?
-
#session_auth=(user)
writeonly
Set the authorized user for this session.
- #supports_ddl_transactions? ⇒ Boolean readonly
- #supports_explain? ⇒ Boolean readonly
-
#supports_extensions? ⇒ Boolean
readonly
Returns true if pg > 9.1.
- #supports_foreign_keys? ⇒ Boolean readonly
- #supports_index_sort_order? ⇒ Boolean readonly
- #supports_materialized_views? ⇒ Boolean readonly
-
#supports_migrations? ⇒ Boolean
readonly
Returns true, since this connection adapter supports migrations.
- #supports_partial_index? ⇒ Boolean readonly
-
#supports_ranges? ⇒ Boolean
readonly
::Range datatypes weren't introduced until PostgreSQL 9.2.
-
#supports_statement_cache? ⇒ Boolean
readonly
Returns
true
, since this connection adapter supports prepared statement caching. - #supports_transaction_isolation? ⇒ Boolean readonly
- #supports_views? ⇒ Boolean readonly
- #use_insert_returning? ⇒ Boolean readonly
PostgreSQL::SchemaStatements - Included
#client_min_messages | Returns the current client message level. |
#client_min_messages= | Set the client message level. |
#schema_search_path | Returns the active schema search path. |
#schema_search_path= | Sets the schema search path to a string of comma-separated schema names. |
AbstractAdapter - Inherited
#active? | Checks whether the connection to the database is still active. |
#in_use? | Alias for AbstractAdapter#owner. |
#logger, #owner, #pool, #prepared_statements, | |
#requires_reloading? | Returns true if its required to reload the connection between requests for development mode. |
#schema_cache, #schema_cache=, #supports_bulk_alter?, | |
#supports_ddl_transactions? | Does this adapter support DDL rollbacks in transactions? That is, would CREATE TABLE or ALTER TABLE get rolled back by a transaction? |
#supports_explain? | Does this adapter support explain? |
#supports_extensions? | Does this adapter support database extensions? |
#supports_foreign_keys? | Does this adapter support creating foreign key constraints? |
#supports_index_sort_order? | Does this adapter support index sort order? |
#supports_indexes_in_create? | Does this adapter support creating indexes in the same statement as creating the table? |
#supports_migrations? | Does this adapter support migrations? |
#supports_partial_index? | Does this adapter support partial indices? |
#supports_primary_key? | Can this adapter determine the primary key for tables not attached to an Active Record class, such as join tables? |
#supports_savepoints? | Does this adapter support savepoints? |
#supports_transaction_isolation? | Does this adapter support setting the isolation level for a transaction? |
#supports_views? | Does this adapter support views? |
#visitor |
DatabaseStatements - Included
#begin_transaction, #commit_transaction, #current_transaction, #open_transactions, #rollback_transaction, | |
#supports_statement_cache? | Returns |
#transaction_open?, #within_new_transaction |
Instance Method Summary
-
#clear_cache!
Clears the prepared statements cache.
- #disable_extension(name)
-
#disconnect!
Disconnects from the database if already connected.
- #enable_extension(name)
- #extension_enabled?(name) ⇒ Boolean
- #extensions
- #index_algorithms
-
#migration_keys
Adds
:array
as a valid migration key. -
#reconnect!
Close then reopen the connection.
- #reset!
- #set_standard_conforming_strings
-
#table_alias_length
Returns the configured supported identifier length supported by PostgreSQL.
- #truncate(table_name, name = nil)
- #valid_type?(type) ⇒ Boolean
PostgreSQL::DatabaseStatements - Included
#begin_db_transaction | Begins a transaction. |
#begin_isolated_db_transaction, | |
#commit_db_transaction | Commits a transaction. |
#create, #exec_delete, #exec_insert, #exec_query, | |
#exec_rollback_db_transaction | Aborts a transaction. |
#exec_update | Alias for PostgreSQL::DatabaseStatements#exec_delete. |
#execute | Executes an SQL statement, returning a PGresult object on success or raising a PGError exception otherwise. |
#explain, | |
#insert_sql | Executes an INSERT query and returns the new record's ID. |
#select_rows | Executes a SELECT query and returns an array of rows. |
#select_value, #select_values, #sql_for_insert, | |
#update_sql | Executes an UPDATE query and returns the number of affected tuples. |
PostgreSQL::SchemaStatements - Included
#change_column | Changes the column of a table. |
#change_column_default | Changes the default value of a table column. |
#change_column_null, | |
#collation | Returns the current database collation. |
#columns | Returns the list of all column definitions for a table. |
#create_database | Create a new PostgreSQL database. |
#create_schema | Creates a schema for the given schema name. |
#ctype | Returns the current database ctype. |
#current_database | Returns the current database name. |
#current_schema | Returns the current schema name. |
#data_source_exists? | Alias for PostgreSQL::SchemaStatements#table_exists?. |
#data_sources |
|
#drop_schema | Drops the schema for the given schema name. |
#drop_table, | |
#encoding | Returns the current database encoding format. |
#foreign_keys, #index_name_exists?, #index_name_length, | |
#indexes | Returns an array of indexes for the given table. |
#primary_key | Returns just a table's primary key. |
#rename_index, | |
#rename_table | Renames a table. |
#schema_exists? | Returns true if schema exists. |
#schema_names | Returns an array of schema names. |
#serial_sequence, | |
#table_exists? | Returns true if table exists. |
#tables | Returns the list of all tables in the schema search path. |
#type_to_sql | Maps logical ::Rails types to PostgreSQL-specific data types. |
PostgreSQL::Quoting - Included
#escape_bytea | Escapes binary strings for bytea input to the database. |
#quote_table_name | Checks the following cases: |
#quote_table_name_for_assignment, | |
#unescape_bytea | Unescapes bytea output from a database to the binary string it represents. |
AbstractAdapter - Inherited
#adapter_name | Returns the human-readable name of the adapter. |
#case_insensitive_comparison, #case_sensitive_comparison, #case_sensitive_modifier, | |
#clear_cache! | Clear any caching the database adapter may be doing, for example clearing the prepared statement cache. |
#close | Check the connection back in to the connection pool. |
#collector, #create_savepoint, #current_savepoint_name, | |
#disable_extension | This is meant to be implemented by the adapters that support extensions. |
#disable_referential_integrity | Override to turn off referential integrity while executing |
#disconnect! | Disconnects from the database if already connected. |
#enable_extension | This is meant to be implemented by the adapters that support extensions. |
#expire, | |
#extensions | A list of extensions, to be filled in by adapters that support them. |
#index_algorithms | A list of index algorithms, to be filled by adapters that support them. |
#lease, #new_column, | |
#prefetch_primary_key? | Should primary key values be selected from their corresponding sequence before the insert statement? If true, next_sequence_value is called before each insert to set the record's primary key. |
#raw_connection | Provides access to the underlying database driver for this adapter. |
#reconnect! | Disconnects from the database if already connected, and establishes a new connection with the database. |
#release_savepoint, | |
#reset! | Reset the state of this connection, directing the DBMS to clear transactions and other connection-related server-side state. |
#schema_creation, | |
#substitute_at | Returns a bind substitution value given a bind |
#unprepared_statement, #valid_type?, | |
#verify! | Checks whether the connection to the database is still active (i.e. not stale). |
ColumnDumper - Included
#column_spec, | |
#migration_keys | Lists the valid migration options. |
#prepare_column_options | This can be overridden on a Adapter level basis to support other extended datatypes (Example: Adding an array option in the |
::ActiveSupport::Callbacks - Included
#run_callbacks | Runs the callbacks for the given event. |
::ActiveRecord::QueryCache - Included
DatabaseLimits - Included
#allowed_index_name_length | Returns the maximum allowed length for an index name. |
#column_name_length | Returns the maximum length of a column name. |
#columns_per_multicolumn_index | Returns the maximum number of columns in a multicolumn index. |
#columns_per_table | Returns the maximum number of columns per table. |
#in_clause_length | Returns the maximum number of elements in an IN (x,y,z) clause. |
#index_name_length | Returns the maximum length of an index name. |
#indexes_per_table | Returns the maximum number of indexes per table. |
#joins_per_query | Returns maximum number of joins in a single query. |
#sql_query_length | Returns the maximum length of an SQL query. |
#table_alias_length | Returns the maximum length of a table alias. |
#table_name_length | Returns the maximum length of a table name. |
Quoting - Included
#quote | Quotes the column value to help prevent SQL injection attacks. |
#quote_column_name | Quotes the column name. |
#quote_string | Quotes a string, escaping any ' (single quote) and \ (backslash) characters. |
#quote_table_name | Quotes the table name. |
#quote_table_name_for_assignment | Override to return the quoted table name for assignment. |
#quoted_date, #quoted_false, #quoted_true, | |
#type_cast | Cast a |
#unquoted_false, #unquoted_true |
DatabaseStatements - Included
#add_transaction_record | Register a record with the current transaction so that its after_commit and after_rollback callbacks can be called. |
#begin_db_transaction | Begins the transaction (and turns off auto-committing). |
#begin_isolated_db_transaction | Begins the transaction with the isolation level set. |
#commit_db_transaction | Commits the transaction (and turns on auto-committing). |
#default_sequence_name, | |
#delete | Executes the delete statement and returns the number of rows affected. |
#empty_insert_statement_value, | |
#exec_delete | Executes delete |
#exec_insert | Executes insert |
#exec_query | Executes |
#exec_update | Executes update |
#execute | Executes the SQL statement in the context of this connection. |
#initialize, | |
#insert | Returns the last auto-generated ID from the affected table. |
#insert_fixture | Inserts the given fixture into the table. |
#reset_sequence! | Set the sequence to the max value of the table's column. |
#rollback_db_transaction | Rolls back the transaction (and turns on auto-committing). |
#rollback_to_savepoint, | |
#sanitize_limit | Sanitizes the given LIMIT parameter in order to prevent SQL injection. |
#select_all | Returns an ::ActiveRecord::Result instance. |
#select_one | Returns a record hash with the column names as keys and column values as values. |
#select_rows | Returns an array of arrays containing the field values. |
#select_value | Returns a single value from a record. |
#select_values | Returns an array of the values of the first column in a select: |
#to_sql | Converts an arel AST to SQL. |
#transaction | Runs the given block in a database transaction, and returns the result of the block. |
#transaction_isolation_levels, #transaction_state, | |
#truncate | Executes the truncate statement. |
#update | Executes the update statement and returns the number of rows affected. |
SchemaStatements - Included
#add_belongs_to | Alias for SchemaStatements#add_reference. |
#add_column | Adds a new column to the named table. |
#add_foreign_key | Adds a new foreign key. |
#add_index | Adds a new index to the table. |
#add_reference | Adds a reference. |
#add_timestamps | Adds timestamps ( |
#assume_migrated_upto_version, | |
#change_column | Changes the column's definition according to the new options. |
#change_column_default | Sets a new default value for a column: |
#change_column_null | Sets or removes a NOT NULL constraint on a column. |
#change_table | A block for changing columns in |
#column_exists? | Checks to see if a column exists in a given table. |
#columns | Returns an array of Column objects for the table specified by |
#create_join_table | Creates a new join table with the name created using the lexical order of the first two arguments. |
#create_table | Creates a new table with the name |
#data_source_exists? | Checks to see if the data source |
#data_sources | Returns the relation names useable to back Active Record models. |
#drop_join_table | Drops the join table specified by the given arguments. |
#drop_table | Drops a table from the database. |
#foreign_keys | Returns an array of foreign keys for the given table. |
#index_exists? | Checks to see if an index exists on a table for a given index definition. |
#index_name_exists? | Verifies the existence of an index with a given name. |
#initialize_schema_migrations_table | Should not be called normally, but this operation is non-destructive. |
#native_database_types | Returns a hash of mappings from the abstract data types to the native database types. |
#remove_belongs_to | Alias for SchemaStatements#remove_reference. |
#remove_column | Removes the column from the table definition. |
#remove_columns | Removes the given columns from the table definition. |
#remove_foreign_key | Removes the given foreign key from the table. |
#remove_index | Removes the given index from the table. |
#remove_reference | Removes the reference(s). |
#remove_timestamps | Removes the timestamp columns ( |
#rename_column | Renames a column. |
#rename_index | Renames an index. |
#rename_table | Renames a table. |
#table_alias_for | Truncates a table alias according to the limits of the current adapter. |
#table_exists? | Checks to see if the table |
Constructor Details
.new(connection, logger, connection_parameters, config) ⇒ PostgreSQLAdapter
Initializes and connects a PostgreSQL adapter.
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 226
def initialize(connection, logger, connection_parameters, config) super(connection, logger) @visitor = Arel::Visitors::PostgreSQL.new self if self.class.type_cast_config_to_boolean(config.fetch(:prepared_statements) { true }) @prepared_statements = true else @prepared_statements = false end @connection_parameters, @config = connection_parameters, config # @local_tz is initialized as nil to avoid warnings when connect tries to use it @local_tz = nil @table_alias_length = nil connect @statements = StatementPool.new @connection, self.class.type_cast_config_to_integer(config.fetch(:statement_limit) { 1000 }) if postgresql_version < 80200 raise "Your version of PostgreSQL (#{postgresql_version}) is too old, please upgrade!" end @type_map = Type::HashLookupTypeMap.new initialize_type_map(type_map) @local_tz = execute('SHOW TIME ZONE', 'SCHEMA').first["TimeZone"] @use_insert_returning = @config.key?(:insert_returning) ? self.class.type_cast_config_to_boolean(@config[:insert_returning]) : true end
Instance Attribute Details
#active? ⇒ Boolean
(readonly)
Is this connection alive and ready for queries?
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 266
def active? @connection.query 'SELECT 1' true rescue PGError false end
#session_auth=(user) (writeonly)
Set the authorized user for this session
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 371
def session_auth=(user) clear_cache! exec_query "SET SESSION AUTHORIZATION #{user}" end
#supports_ddl_transactions? ⇒ Boolean
(readonly)
[ GitHub ]
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 315
def supports_ddl_transactions? true end
#supports_explain? ⇒ Boolean
(readonly)
[ GitHub ]
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 319
def supports_explain? true end
#supports_extensions? ⇒ Boolean
(readonly)
Returns true if pg > 9.1
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 324
def supports_extensions? postgresql_version >= 90100 end
#supports_foreign_keys? ⇒ Boolean
(readonly)
[ GitHub ]
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 160
def supports_foreign_keys? true end
#supports_index_sort_order? ⇒ Boolean
(readonly)
[ GitHub ]
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 148
def supports_index_sort_order? true end
#supports_materialized_views? ⇒ Boolean
(readonly)
[ GitHub ]
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 333
def supports_materialized_views? postgresql_version >= 90300 end
#supports_migrations? ⇒ Boolean
(readonly)
Returns true, since this connection adapter supports migrations.
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 302
def supports_migrations? true end
#supports_partial_index? ⇒ Boolean
(readonly)
[ GitHub ]
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 152
def supports_partial_index? true end
#supports_ranges? ⇒ Boolean
(readonly)
::Range datatypes weren't introduced until PostgreSQL 9.2
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 329
def supports_ranges? postgresql_version >= 90200 end
#supports_statement_cache? ⇒ Boolean
(readonly)
Returns true
, since this connection adapter supports prepared statement caching.
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 144
def supports_statement_cache? true end
#supports_transaction_isolation? ⇒ Boolean
(readonly)
[ GitHub ]
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 156
def supports_transaction_isolation? true end
#supports_views? ⇒ Boolean
(readonly)
[ GitHub ]
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 164
def supports_views? true end
#use_insert_returning? ⇒ Boolean
(readonly)
[ GitHub ]
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 376
def use_insert_returning? @use_insert_returning end
Instance Method Details
#clear_cache!
Clears the prepared statements cache.
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 257
def clear_cache! @statements.clear end
#disable_extension(name)
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 343
def disable_extension(name) exec_query("DROP EXTENSION IF EXISTS \"#{name}\" CASCADE").tap { reload_type_map } end
#disconnect!
Disconnects from the database if already connected. Otherwise, this method does nothing.
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 292
def disconnect! super @connection.close rescue nil end
#enable_extension(name)
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 337
def enable_extension(name) exec_query("CREATE EXTENSION IF NOT EXISTS \"#{name}\"").tap { reload_type_map } end
#extension_enabled?(name) ⇒ Boolean
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 349
def extension_enabled?(name) if supports_extensions? res = exec_query "SELECT EXISTS(SELECT * FROM pg_available_extensions WHERE name = '#{name}' AND installed_version IS NOT NULL) as enabled", 'SCHEMA' res.cast_values.first end end
#extensions
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 357
def extensions if supports_extensions? exec_query("SELECT extname from pg_extension", "SCHEMA").cast_values else super end end
#index_algorithms
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 168
def index_algorithms { concurrently: 'CONCURRENTLY' } end
#migration_keys
Adds :array
as a valid migration key
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 138
def migration_keys super + [:array] end
#reconnect!
Close then reopen the connection.
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 274
def reconnect! super @connection.reset configure_connection end
#reset!
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 280
def reset! clear_cache! reset_transaction unless @connection.transaction_status == ::PG::PQTRANS_IDLE @connection.query 'ROLLBACK' end @connection.query 'DISCARD ALL' configure_connection end
#set_standard_conforming_strings
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 311
def set_standard_conforming_strings execute('SET standard_conforming_strings = on', 'SCHEMA') end
#table_alias_length
Returns the configured supported identifier length supported by PostgreSQL
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 366
def table_alias_length @table_alias_length ||= query('SHOW max_identifier_length', 'SCHEMA')[0][0].to_i end
#truncate(table_name, name = nil)
[ GitHub ]# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 261
def truncate(table_name, name = nil) exec_query "TRUNCATE TABLE #{quote_table_name(table_name)}", name, [] end
#valid_type?(type) ⇒ Boolean
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 380
def valid_type?(type) !native_database_types[type].nil? end