класс ActiveRecord::ConnectionAdapters::AbstractAdapter
Active Record поддерживает несколько систем баз данных. AbstractAdapter и связанные классы образуют абстрактный уровень, что делает это возможным. AbstractAdapter представляет подключение к базе данных и предоставляет абстрактный интерфейс для функций, специфичных для базы данных, таких как установление соединения, экранирование значений, построение правильных фрагментов SQL для :offset и :limit опций и т. д.
Все конкретные адаптеры баз данных следуют интерфейсу, заданному в этом классе. ActiveRecord::Base.connection возвращает объект AbstractAdapter, который вы можете использовать.
Большинство методов в адаптере полезны во время миграций. В частности, методы экземпляра, предоставляемые SchemaStatements, очень полезны.
Константы
- ADAPTER_NAME
- COMMENT_REGEX
- SIMPLE_INT
Атрибуты
Открытые методы класса
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 267 def self.database_exists?(config) raise NotImplementedError end
Существует ли база данных для этого адаптера?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 58
def self.type_cast_config_to_boolean(config)
if config == "false"
false
else
config
end
end # File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 48
def self.type_cast_config_to_integer(config)
if config.is_a?(Integer)
config
elsif SIMPLE_INT.match?(config)
config.to_i
else
config
end
end Публичные методы экземпляра
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 470 def active? end
Проверяет, активно ли соединение с базой данных. Это включает проверку того, способна ли база данных фактически отвечать, т.е. не устарело ли соединение.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 262 def adapter_name self.class::ADAPTER_NAME end
Возвращает понятное имя адаптера. Используйте регистр с заглавными буквами — при необходимости всегда можно использовать нижний регистр.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 521
def clear_cache!
@lock.synchronize { @statements.clear } if @statements
end Очищает любое кэширование, которое может выполнять адаптер базы данных.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 572 def close pool.checkin self end
Возвращает соединение в пул соединений
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 423 def disable_extension(name) end
Предназначен для реализации адаптерами, которые поддерживают расширения
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 461 def disable_referential_integrity yield end
Переопределите, чтобы отключить целостность ссылок при выполнении &block.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 494
def discard!
# This should be overridden by concrete adapters.
#
# Prevent @connection's finalizer from touching the socket, or
# otherwise communicating with its server, when it is collected.
if schema_cache.connection == self
schema_cache.connection = nil
end
end Немедленно забудьте, что это соединение когда-либо существовало. В отличие от disconnect!, это не будет взаимодействовать с сервером.
После вызова этого метода поведение всех других методов становится неопределенным. Это вызывается внутренне непосредственно перед тем, как разветвленный процесс избавляется от соединения, принадлежащего его родителю.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 483 def disconnect! clear_cache! reset_transaction end
Отключается от базы данных, если уже подключено. В противном случае этот метод ничего не делает.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 427 def enable_extension(name) end
Предназначен для реализации адаптерами, которые поддерживают расширения
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 219
def expire
if in_use?
if @owner != Thread.current
raise ActiveRecordError, "Cannot expire connection, " \
"it is owned by a different thread: #{@owner}. " \
"Current thread: #{Thread.current}."
end
@idle_since = Concurrent.monotonic_time
@owner = nil
else
raise ActiveRecordError, "Cannot expire connection, it is not currently leased."
end
end этот метод должен вызываться только при удержании мьютекса пула соединений
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 449 def extensions [] end
Список расширений, который должен быть заполнен адаптерами, которые их поддерживают.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 454
def index_algorithms
{}
end Список алгоритмов индексирования, который должен быть заполнен адаптерами, которые их поддерживают.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 190
def lease
if in_use?
msg = +"Cannot lease connection, "
if @owner == Thread.current
msg << "it is already leased by the current thread."
else
msg << "it is already in use by a different thread: #{@owner}. " \
"Current thread: #{Thread.current}."
end
raise ActiveRecordError, msg
end
@owner = Thread.current
end этот метод должен вызываться только при удержании мьютекса пула соединений
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 294 def prefetch_primary_key?(table_name = nil) false end
Следует ли выбирать значения первичных ключей из соответствующей последовательности перед оператором insert? Если true, next_sequence_value вызывается перед каждой вставкой для установки первичного ключа записи.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 158 def prepared_statements @prepared_statements && !prepared_statements_disabled_cache.include?(object_id) end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 123 def preventing_writes? return true if replica? return ActiveRecord::Base.connection_handler.prevent_writes if ActiveRecord::Base.legacy_connection_handling return false if owner_name.nil? klass = self.owner_name.safe_constantize klass&.current_preventing_writes end
Определяет, предотвращаются ли в данный момент записи.
Возвращает true, если соединение является репликой.
Если приложение использует устаревшую обработку, возвращает true, если установлен `connection_handler.prevent_writes`.
Если приложение использует новую обработку соединений, вернет true на основе `current_preventing_writes`.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 543 def raw_connection disable_lazy_transactions! @connection end
Обеспечивает доступ к базовому драйверу базы данных для этого адаптера. Например, этот метод возвращает объект Mysql2::Client в случае Mysql2Adapter и объект PG::Connection в случае PostgreSQLAdapter.
Это полезно, когда вам нужно вызвать собственный метод, например, методы lo_* PostgreSQL.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 476 def reconnect! clear_cache! reset_transaction end
Отключается от базы данных, если уже подключено, и устанавливает новое соединение с базой данных. Разработчики должны вызвать super, если они переопределяют реализацию по умолчанию.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 106 def replica? @config[:replica] || false end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 526 def requires_reloading? false end
Возвращает true, если требуется перезагрузить соединение между запросами для режима разработки.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 510 def reset! # this should be overridden by concrete adapters end
Сбрасывает состояние этого соединения, направляя СУБД на очистку транзакций и другого состояния сервера, связанного с соединением. Обычно операция, зависящая от базы данных.
Реализация по умолчанию ничего не делает; реализация должна быть переопределена конкретными адаптерами.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 209 def schema_cache @pool.get_schema_cache(self) end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 213 def schema_cache=(cache) cache.connection = self @pool.set_schema_cache(cache) end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 287 def supports_advisory_locks? false end
Поддерживает ли этот адаптер блокировку advisory, принудительную со стороны приложения?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 277 def supports_bulk_alter? false end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 349 def supports_check_constraints? false end
Поддерживает ли этот адаптер создание ограничений CHECK?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 374 def supports_comments? false end
Поддерживает ли этот адаптер метаданные комментарии к объектам базы данных (таблицы, столбцы, индексы)?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 379 def supports_comments_in_create? false end
Можно ли указать комментарии к таблицам, столбцам и индексам в операторах создания/изменения таблиц?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 398 def supports_common_table_expressions? false end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 364 def supports_datetime_with_precision? false end
Поддерживает ли этот адаптер datetime с точностью?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 273 def supports_ddl_transactions? false end
Поддерживает ли этот адаптер откат DDL-операций в транзакциях? То есть, CREATE TABLE или ALTER TABLE будут отменены транзакцией?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 318 def supports_explain? false end
Поддерживает ли этот адаптер explain?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 313 def supports_expression_index? false end
Поддерживает ли этот адаптер индексы выражений?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 328 def supports_extensions? false end
Поддерживает ли этот адаптер расширения базы данных?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 339 def supports_foreign_keys? false end
Поддерживает ли этот адаптер создание ограничений внешних ключей?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 389 def supports_foreign_tables? false end
Поддерживает ли этот адаптер внешние таблицы?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 303 def supports_index_sort_order? false end
Поддерживает ли этот адаптер порядок сортировки в индексах?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 334 def supports_indexes_in_create? false end
Поддерживает ли этот адаптер создание индексов в том же операторе, что и создание таблицы?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 418 def supports_insert_conflict_target? false end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 410 def supports_insert_on_duplicate_skip? false end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 414 def supports_insert_on_duplicate_update? false end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 406 def supports_insert_returning? false end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 369 def supports_json? false end
Поддерживает ли этот адаптер тип данных json?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 402 def supports_lazy_transactions? false end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 359 def supports_materialized_views? false end
Поддерживает ли этот адаптер материализованные представления?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 394 def supports_optimizer_hints? false end
Поддерживает ли этот адаптер подсказки оптимизатора?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 308 def supports_partial_index? false end
Поддерживает ли этот адаптер частичные индексы?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 298 def supports_partitioned_indexes? false end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 282 def supports_savepoints? false end
Поддерживает ли этот адаптер savepoints?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 323 def supports_transaction_isolation? false end
Поддерживает ли этот адаптер установку уровня изоляции для транзакции?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 344 def supports_validate_constraints? false end
Поддерживает ли этот адаптер создание невалидных ограничений?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 354 def supports_views? false end
Поддерживает ли этот адаптер представления?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 384 def supports_virtual_columns? false end
Поддерживает ли этот адаптер виртуальные столбцы?
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 515 def throw_away! pool.remove self disconnect! end
Удаляет соединение из пула и отключает его.
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 253 def unprepared_statement cache = prepared_statements_disabled_cache.add(object_id) if @prepared_statements yield ensure cache&.delete(object_id) end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 110 def use_metadata_table? @config.fetch(:use_metadata_table, true) end
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 533 def verify! reconnect! unless active? end
Проверяет, активен ли (т.е. не устарел) подключение к базе данных. Это выполняется "под капотом", вызывая active?. Если соединение больше не активно, то этот метод переподключится к базе данных.
Методы частного экземпляра
# File activerecord/lib/active_record/connection_adapters/abstract_adapter.rb, line 687
def log(sql, name = "SQL", binds = [], type_casted_binds = [], statement_name = nil) # :doc:
@instrumenter.instrument(
"sql.active_record",
sql: sql,
name: name,
binds: binds,
type_casted_binds: type_casted_binds,
statement_name: statement_name,
connection: self) do
@lock.synchronize do
yield
end
rescue => e
raise translate_exception_class(e, sql, binds)
end
end
© 2004–2020 David Heinemeier Hansson
Licensed under the MIT License.