Active Record PostgreSQL 适配器
PostgreSQL 适配器与本机 C (github.com/ged/ruby-pg) 驱动程序配合使用。
选项
-
:host
- 默认为 /tmp 中的 Unix 域套接字。在没有 Unix 域套接字的机器上,默认连接到 localhost。 -
:port
- 默认为 5432。 -
:username
- 默认为运行应用程序的用户的操作系统名称。 -
:password
- 如果服务器要求密码身份验证,则使用密码。 -
:database
- 默认为与用户名相同。 -
:schema_search_path
- 作为逗号分隔的架构名称字符串给出的连接的可选架构搜索路径。这与:schema_order
选项向后兼容。 -
:encoding
- 在连接上用于SET client_encoding TO <encoding>
调用的可选客户端编码。 -
:min_messages
- 在连接上用于SET client_min_messages TO <min_messages>
调用的可选客户端最小消息。 -
:variables
- 在连接上用于SET SESSION key = val
调用的附加参数的可选哈希。 -
:insert_returning
- 控制INSERT
语句使用RETURNING
的可选布尔值,默认为 true。
任何其他选项都用作 libpq 的连接参数。请参阅 www.postgresql.org/docs/current/static/libpq-connect.html 了解参数列表。
此外,可以通过环境变量设置 libpq 的默认连接参数。请参阅 www.postgresql.org/docs/current/static/libpq-envars.html 。
- A
- C
- D
- E
- I
- M
- N
- R
- S
-
- session_auth=,
- set_standard_conforming_strings,
- supports_advisory_locks?,
- supports_bulk_alter?,
- supports_check_constraints?,
- supports_comments?,
- supports_common_table_expressions?,
- supports_datetime_with_precision?,
- supports_ddl_transactions?,
- supports_deferrable_constraints?,
- supports_exclusion_constraints?,
- supports_explain?,
- supports_expression_index?,
- supports_extensions?,
- supports_foreign_keys?,
- supports_foreign_tables?,
- supports_index_include?,
- supports_index_sort_order?,
- supports_insert_conflict_target?,
- supports_insert_on_conflict?,
- supports_insert_on_duplicate_skip?,
- supports_insert_on_duplicate_update?,
- supports_insert_returning?,
- supports_json?,
- supports_lazy_transactions?,
- supports_materialized_views?,
- supports_nulls_not_distinct?,
- supports_optimizer_hints?,
- supports_partial_index?,
- supports_partitioned_indexes?,
- supports_pgcrypto_uuid?,
- supports_restart_db_transaction?,
- supports_savepoints?,
- supports_transaction_isolation?,
- supports_unique_constraints?,
- supports_validate_constraints?,
- supports_views?,
- supports_virtual_columns?
- U
- ActiveRecord::ConnectionAdapters::PostgreSQL::Quoting
- ActiveRecord::ConnectionAdapters::PostgreSQL::SchemaStatements
- ActiveRecord::ConnectionAdapters::PostgreSQL::DatabaseStatements
常量
ADAPTER_NAME | = | "PostgreSQL" |
DEADLOCK_DETECTED | = | "40P01" |
DUPLICATE_DATABASE | = | "42P04" |
FOREIGN_KEY_VIOLATION | = | "23503" |
LOCK_NOT_AVAILABLE | = | "55P03" |
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://postgresql.ac.cn/docs/current/datatype-enum.html } |
NOT_NULL_VIOLATION | = | "23502" |
NUMERIC_VALUE_OUT_OF_RANGE | = | "22003" |
QUERY_CANCELED | = | "57014" |
SERIALIZATION_FAILURE | = | "40001" |
UNIQUE_VIOLATION | = | "23505" |
VALUE_LIMIT_VIOLATION | = | "22001" |
参见 www.postgresql.org/docs/current/static/errcodes-appendix.html |
类公共方法
create_unlogged_tables 链接
PostgreSQL 允许创建“未记录”表,该表不会在 PostgreSQL 预写日志中记录数据。这可以使表更快,但如果数据库崩溃,则会显著增加数据丢失的风险。因此,不应在生产环境中使用此功能。如果你希望在测试环境中记录所有已创建的表,则可以将以下内容添加到 test.rb 文件中
ActiveSupport.on_load(:active_record_postgresqladapter) do
self.create_unlogged_tables = true
end
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 116 class_attribute :create_unlogged_tables, default: false
datetime_type 链接
PostgreSQL 支持多种 DateTime 类型。默认情况下,如果你在迁移中使用 datetime
,Rails 会将其转换为 PostgreSQL 的“无时区时间戳”。在初始化程序中更改此设置以使用其他 NATIVE_DATABASE_TYPES
。例如,将 DateTime 存储为“带时区时间戳”
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.datetime_type = :timestamptz
或者如果你正在添加自定义类型
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::NATIVE_DATABASE_TYPES[:my_custom_type] = { name: "my_custom_type_name" }
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.datetime_type = :my_custom_type
如果你正在使用 :ruby
作为 config.active_record.schema_format
,并且更改了此设置,你应该立即运行 bin/rails db:migrate
以更新 schema.rb 中的类型。
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 134 class_attribute :datetime_type, default: :timestamp
dbconsole(config, options = {}) 链接
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 84 def dbconsole(config, options = {}) 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] && options[: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("psql", config.database) end
new(...) 链接
初始化并连接一个 PostgreSQL 适配器。
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 322 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
new_client(conn_params) 链接
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 68 def new_client(conn_params) PG.connect(**conn_params) rescue ::PG::Error => error if conn_params && conn_params[:dbname] == "postgres" raise ActiveRecord::ConnectionNotEstablished, error.message elsif conn_params && conn_params[:dbname] && error.message.include?(conn_params[:dbname]) raise ActiveRecord::NoDatabaseError.db_error(conn_params[:dbname]) elsif conn_params && conn_params[:user] && error.message.include?(conn_params[:user]) raise ActiveRecord::DatabaseConnectionError.username_error(conn_params[:user]) elsif conn_params && conn_params[:host] && error.message.include?(conn_params[:host]) raise ActiveRecord::DatabaseConnectionError.hostname_error(conn_params[:host]) else raise ActiveRecord::ConnectionNotEstablished, error.message end end
实例公共方法
active?() 链接
此连接是否有效且可用于查询?
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 346 def active? @lock.synchronize do return false unless @raw_connection @raw_connection.query ";" end true rescue PG::Error false end
add_enum_value(type_name, value, options = {}) 链接
向现有的枚举类型添加枚举值。
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 570 def add_enum_value(type_name, value, options = {}) before, after = options.values_at(:before, :after) sql = +"ALTER TYPE #{quote_table_name(type_name)} ADD VALUE '#{value}'" if before && after raise ArgumentError, "Cannot have both :before and :after at the same time" elsif before sql << " BEFORE '#{before}'" elsif after sql << " AFTER '#{after}'" end execute(sql).tap { reload_type_map } end
create_enum(name, values, **options) 链接
给定一个名称和一个值数组,创建一个枚举类型。
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 525 def create_enum(name, values, **options) 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 internal_exec_query(query).tap { reload_type_map } end
disable_extension(name, force: false) 链接
从数据库中删除扩展。
:force
-
设置为
:cascade
以同时删除依赖对象。默认为 false。
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 483 def disable_extension(name, force: false) internal_exec_query("DROP EXTENSION IF EXISTS \"#{name}\"#{' CASCADE' if force == :cascade}").tap { reload_type_map } end
disconnect!() 链接
如果已连接,则断开与数据库的连接。否则,此方法不执行任何操作。
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 383 def disconnect! @lock.synchronize do super @raw_connection&.close rescue nil @raw_connection = nil end end
drop_enum(name, values = nil, **options) 链接
删除枚举类型。
如果提供了 if_exists: true
选项,则仅在枚举存在时才删除该枚举。否则,如果枚举不存在,则会引发错误。
如果存在,则 values
参数将被忽略。在迁移的 change
方法中提供此参数可能会有所帮助,以便可以还原它。在这种情况下,values
将由 create_enum
使用。
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 555 def drop_enum(name, values = nil, **options) query = <<~SQL DROP TYPE#{' IF EXISTS' if options[:if_exists]} #{quote_table_name(name)}; SQL internal_exec_query(query).tap { reload_type_map } end
enable_extension(name, **) 链接
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 470 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 internal_exec_query(sql).tap { reload_type_map } end
enum_types() 链接
返回已定义枚举类型及其值的列表。
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 502 def enum_types query = <<~SQL SELECT type.typname AS name, type.OID AS oid, n.nspname AS schema, string_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 internal_exec_query(query, "SCHEMA", allow_retry: true, materialize_transactions: false).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) 链接
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 489 def extension_available?(name) query_value("SELECT true FROM pg_available_extensions WHERE name = #{quote(name)}", "SCHEMA") end
extension_enabled?(name) 链接
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 493 def extension_enabled?(name) query_value("SELECT installed_version IS NOT NULL FROM pg_available_extensions WHERE name = #{quote(name)}", "SCHEMA") end
extensions() 链接
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 497 def extensions internal_exec_query("SELECT extname FROM pg_extension", "SCHEMA", allow_retry: true, materialize_transactions: false).cast_values end
index_algorithms() 链接
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 289 def index_algorithms { concurrently: "CONCURRENTLY" } end
max_identifier_length() 链接
返回 PostgreSQL 支持的已配置支持标识符长度
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 600 def max_identifier_length @max_identifier_length ||= query_value("SHOW max_identifier_length", "SCHEMA").to_i end
rename_enum(name, options = {}) 链接
将现有枚举类型重命名为其他内容。
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 563 def rename_enum(name, options = {}) to = options.fetch(:to) { raise ArgumentError, ":to is required" } exec_query("ALTER TYPE #{quote_table_name(name)} RENAME TO #{to}").tap { reload_type_map } end
rename_enum_value(type_name, options = {}) 链接
重命名现有枚举类型上的枚举值。
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 586 def rename_enum_value(type_name, options = {}) unless database_version >= 10_00_00 # >= 10.0 raise ArgumentError, "Renaming enum values is only supported in PostgreSQL 10 or later" end from = options.fetch(:from) { raise ArgumentError, ":from is required" } to = options.fetch(:to) { raise ArgumentError, ":to is required" } execute("ALTER TYPE #{quote_table_name(type_name)} RENAME VALUE '#{from}' TO '#{to}'").tap { reload_type_map } end
reset!() 链接
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 368 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) 链接
设置此会话的授权用户
set_standard_conforming_strings() 链接
supports_advisory_locks?() 链接
supports_bulk_alter?() 链接
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 190 def supports_bulk_alter? true end
supports_check_constraints?() 链接
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 222 def supports_check_constraints? true end
supports_comments?() 链接
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 254 def supports_comments? true end
supports_common_table_expressions?() 链接
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 448 def supports_common_table_expressions? true end
supports_datetime_with_precision?() 链接
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 246 def supports_datetime_with_precision? true end
supports_ddl_transactions?() 链接
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 413 def supports_ddl_transactions? true end
supports_deferrable_constraints?() 链接
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 238 def supports_deferrable_constraints? true end
supports_exclusion_constraints?() 链接
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 226 def supports_exclusion_constraints? true end
supports_explain?() 链接
源代码: 显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 421 def supports_explain? true end
supports_expression_index?() 链接
源代码: 显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 210 def supports_expression_index? true end
supports_extensions?() 链接
源代码: 显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 425 def supports_extensions? true end
supports_foreign_keys?() 链接
源代码: 显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 218 def supports_foreign_keys? true end
supports_foreign_tables?() 链接
源代码: 显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 433 def supports_foreign_tables? true end
supports_index_include?() 链接
源代码: 显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 206 def supports_index_include? database_version >= 11_00_00 # >= 11.0 end
supports_index_sort_order?() 链接
源代码: 显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 194 def supports_index_sort_order? true end
supports_insert_on_conflict?() 链接
supports_insert_returning?() 链接
supports_json?() 链接
supports_lazy_transactions?() 链接
supports_materialized_views?() 链接
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 429 def supports_materialized_views? true end
supports_nulls_not_distinct?() 链接
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 285 def supports_nulls_not_distinct? database_version >= 15_00_00 # >= 15.0 end
supports_optimizer_hints?() 链接
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 441 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?() 链接
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 202 def supports_partial_index? true end
supports_partitioned_indexes?() 链接
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 198 def supports_partitioned_indexes? database_version >= 11_00_00 # >= 11.0 end
supports_pgcrypto_uuid?() 链接
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 437 def supports_pgcrypto_uuid? database_version >= 9_04_00 # >= 9.4 end
supports_restart_db_transaction?() 链接
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 262 def supports_restart_db_transaction? database_version >= 12_00_00 # >= 12.0 end
supports_savepoints?() 链接
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 258 def supports_savepoints? true end
supports_transaction_isolation?() 链接
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 214 def supports_transaction_isolation? true end
supports_unique_constraints?() 链接
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 230 def supports_unique_constraints? true end
supports_validate_constraints?() 链接
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 234 def supports_validate_constraints? true end
supports_views?() 链接
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 242 def supports_views? true end
supports_virtual_columns?() 链接
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 277 def supports_virtual_columns? database_version >= 12_00_00 # >= 12.0 end
use_insert_returning?() 链接
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 610 def use_insert_returning? @use_insert_returning end