Spec-Zone.ru › Ruby on Rails 6.1

класс ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter

Родитель:
ActiveRecord::ConnectionAdapters::AbstractAdapter

Константы

ER_CANNOT_ADD_FOREIGN
ER_CANNOT_CREATE_TABLE
ER_DATA_TOO_LONG
ER_DB_CREATE_EXISTS

См. dev.mysql.com/doc/mysql-errors/en/server-error-reference.html

ER_DO_NOT_HAVE_DEFAULT
ER_DUP_ENTRY
ER_FILSORT_ABORT
ER_FK_INCOMPATIBLE_COLUMNS
ER_LOCK_DEADLOCK
ER_LOCK_WAIT_TIMEOUT
ER_NOT_NULL_VIOLATION
ER_NO_REFERENCED_ROW
ER_NO_REFERENCED_ROW_2
ER_OUT_OF_RANGE
ER_QUERY_INTERRUPTED
ER_QUERY_TIMEOUT
ER_ROW_IS_REFERENCED
ER_ROW_IS_REFERENCED_2
NATIVE_DATABASE_TYPES

Публичные методы класса

emulate_booleans() Показать исходный код
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 27
class_attribute :emulate_booleans, default: true

По умолчанию, Mysql2Adapter будет считать все столбцы типа tinyint(1) как булевы. Если вы хотите отключить эту эмуляцию, вы можете добавить следующую строку в файл application.rb:

ActiveRecord::ConnectionAdapters::Mysql2Adapter.emulate_booleans = false
new(connection, logger, connection_options, config) Показать исходный код
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 53
def initialize(connection, logger, connection_options, config)
  super(connection, logger, config)
end
Вызывает метод родительского класса ActiveRecord::ConnectionAdapters::QueryCache::new

Открытые методы экземпляра

begin_db_transaction() Показать исходный код
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 218
def begin_db_transaction
  execute("BEGIN", "TRANSACTION")
end
begin_isolated_db_transaction(isolation) Показать исходный код
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 222
def begin_isolated_db_transaction(isolation)
  execute "SET TRANSACTION ISOLATION LEVEL #{transaction_isolation_levels.fetch(isolation)}"
  begin_db_transaction
end
charset() Показать исходный код
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 282
def charset
  show_variable "character_set_database"
end

Возвращает кодировку базы данных.

check_constraints(table_name) Показать исходный код
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 426
      def check_constraints(table_name)
        if supports_check_constraints?
          scope = quoted_scope(table_name)

          chk_info = exec_query(<<~SQL, "SCHEMA")
            SELECT cc.constraint_name AS 'name',
                  cc.check_clause AS 'expression'
            FROM information_schema.check_constraints cc
            JOIN information_schema.table_constraints tc
            USING (constraint_schema, constraint_name)
            WHERE tc.table_schema = #{scope[:schema]}
              AND tc.table_name = #{scope[:name]}
              AND cc.constraint_schema = #{scope[:schema]}
          SQL

          chk_info.map do |row|
            options = {
              name: row["name"]
            }
            expression = row["expression"]
            expression = expression[1..-2] unless mariadb? # remove parentheses added by mysql
            CheckConstraintDefinition.new(table_name, expression, options)
          end
        else
          raise NotImplementedError
        end
      end
collation() Показать исходный код
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 287
def collation
  show_variable "collation_database"
end

Возвращает стратегию сортировки базы данных.

create_database(name, options = {}) Показать исходный код
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 257
def create_database(name, options = {})
  if options[:collation]
    execute "CREATE DATABASE #{quote_table_name(name)} DEFAULT COLLATE #{quote_table_name(options[:collation])}"
  elsif options[:charset]
    execute "CREATE DATABASE #{quote_table_name(name)} DEFAULT CHARACTER SET #{quote_table_name(options[:charset])}"
  elsif row_format_dynamic_by_default?
    execute "CREATE DATABASE #{quote_table_name(name)} DEFAULT CHARACTER SET `utf8mb4`"
  else
    raise "Configure a supported :charset and ensure innodb_large_prefix is enabled to support indexes on varchar(255) string columns."
  end
end

Создает новую базу данных MySQL с необязательными параметрами :charset и :collation. Кодировка по умолчанию utf8mb4.

Пример:

create_database 'charset_test', charset: 'latin1', collation: 'latin1_bin'
create_database 'matt_development'
create_database 'matt_development', charset: :big5
current_database() Показать исходный код
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 277
def current_database
  query_value("SELECT database()", "SCHEMA")
end
drop_table(table_name, **options) Показать исходный код
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 334
def drop_table(table_name, **options)
  schema_cache.clear_data_source_cache!(table_name.to_s)
  execute "DROP#{' TEMPORARY' if options[:temporary]} TABLE#{' IF EXISTS' if options[:if_exists]} #{quote_table_name(table_name)}#{' CASCADE' if options[:force] == :cascade}"
end

Удаляет таблицу из базы данных.

:force

Установите в :cascade для удаления зависимых объектов. По умолчанию false.

:if_exists

Установите в true для удаления таблицы только если она существует. По умолчанию false.

:temporary

Установите в true для удаления временной таблицы. По умолчанию false.

Хотя эта команда игнорирует большинство параметров options и блок, если он задан, может быть полезно указать их в методе change миграции, чтобы его можно было отменить. В этом случае options и блок будут использоваться create_table.

empty_insert_statement_value(primary_key = nil) Показать исходный код
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 235
def empty_insert_statement_value(primary_key = nil)
  "VALUES ()"
end
execute(sql, name = nil) Показать исходный код
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 200
def execute(sql, name = nil)
  materialize_transactions
  mark_transaction_written_if_write(sql)

  log(sql, name) do
    ActiveSupport::Dependencies.interlock.permit_concurrent_loads do
      @connection.query(sql)
    end
  end
end

Выполняет SQL-запрос в контексте этого соединения.

foreign_keys(table_name) Показать исходный код
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 390
      def foreign_keys(table_name)
        raise ArgumentError unless table_name.present?

        scope = quoted_scope(table_name)

        fk_info = exec_query(<<~SQL, "SCHEMA")
          SELECT fk.referenced_table_name AS 'to_table',
                 fk.referenced_column_name AS 'primary_key',
                 fk.column_name AS 'column',
                 fk.constraint_name AS 'name',
                 rc.update_rule AS 'on_update',
                 rc.delete_rule AS 'on_delete'
          FROM information_schema.referential_constraints rc
          JOIN information_schema.key_column_usage fk
          USING (constraint_schema, constraint_name)
          WHERE fk.referenced_column_name IS NOT NULL
            AND fk.table_schema = #{scope[:schema]}
            AND fk.table_name = #{scope[:name]}
            AND rc.constraint_schema = #{scope[:schema]}
            AND rc.table_name = #{scope[:name]}
        SQL

        fk_info.map do |row|
          options = {
            column: row["column"],
            name: row["name"],
            primary_key: row["primary_key"]
          }

          options[:on_update] = extract_foreign_key_action(row["on_update"])
          options[:on_delete] = extract_foreign_key_action(row["on_delete"])

          ForeignKeyDefinition.new(table_name, row["to_table"], options)
        end
      end
index_algorithms() Показать исходный код
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 152
def index_algorithms
  {
    default: "ALGORITHM = DEFAULT",
    copy:    "ALGORITHM = COPY",
    inplace: "ALGORITHM = INPLACE",
    instant: "ALGORITHM = INSTANT",
  }
end
native_database_types() Показать исходный код
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 148
def native_database_types
  NATIVE_DATABASE_TYPES
end
recreate_database(name, options = {}) Показать исходный код
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 243
def recreate_database(name, options = {})
  drop_database(name)
  sql = create_database(name, options)
  reconnect!
  sql
end

Удаляет базу данных, указанную в атрибуте name, и создает её снова, используя предоставленные параметры options.

rename_index(table_name, old_name, new_name) Показать исходный код
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 339
def rename_index(table_name, old_name, new_name)
  if supports_rename_index?
    validate_index_length!(table_name, new_name)

    execute "ALTER TABLE #{quote_table_name(table_name)} RENAME INDEX #{quote_table_name(old_name)} TO #{quote_table_name(new_name)}"
  else
    super
  end
end
Вызывает метод суперкласса
rename_table(table_name, new_name) Показать исходный код
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 312
def rename_table(table_name, new_name)
  schema_cache.clear_data_source_cache!(table_name.to_s)
  schema_cache.clear_data_source_cache!(new_name.to_s)
  execute "RENAME TABLE #{quote_table_name(table_name)} TO #{quote_table_name(new_name)}"
  rename_table_indexes(table_name, new_name)
end

Переименовывает таблицу.

Пример:

rename_table('octopuses', 'octopi')
show_variable(name) Показать исходный код
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 484
def show_variable(name)
  query_value("SELECT @@#{name}", "SCHEMA")
rescue ActiveRecord::StatementInvalid
  nil
end

SHOW VARIABLES LIKE 'name'

strict_mode?() Показать исходный код
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 535
def strict_mode?
  self.class.type_cast_config_to_boolean(@config.fetch(:strict, true))
end
supports_advisory_locks?() Показать исходный код
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 128
def supports_advisory_locks?
  true
end
supports_bulk_alter?() Показать исходный код
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 67
def supports_bulk_alter?
  true
end
supports_check_constraints?() Показать исходный код
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 95
def supports_check_constraints?
  if mariadb?
    database_version >= "10.2.1"
  else
    database_version >= "8.0.16"
  end
end
supports_common_table_expressions?() Показать исходный код
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 120
def supports_common_table_expressions?
  if mariadb?
    database_version >= "10.2.1"
  else
    database_version >= "8.0.1"
  end
end
supports_datetime_with_precision?() Показать исходный код
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 107
def supports_datetime_with_precision?
  mariadb? || database_version >= "5.6.4"
end
supports_explain?() Показать исходный код
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 83
def supports_explain?
  true
end
supports_expression_index?() Показать исходный код
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 75
def supports_expression_index?
  !mariadb? && database_version >= "8.0.13"
end
supports_foreign_keys?() Показать исходный код
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 91
def supports_foreign_keys?
  true
end
supports_index_sort_order?() Показать исходный код
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 71
def supports_index_sort_order?
  !mariadb? && database_version >= "8.0.1"
end
supports_indexes_in_create?() Показать исходный код
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 87
def supports_indexes_in_create?
  true
end
supports_insert_on_duplicate_skip?() Показать исходный код
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 132
def supports_insert_on_duplicate_skip?
  true
end
supports_insert_on_duplicate_update?() Показать исходный код
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 136
def supports_insert_on_duplicate_update?
  true
end
supports_optimizer_hints?() Показать исходный код
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 116
def supports_optimizer_hints?
  !mariadb? && database_version >= "5.7.7"
end

См. dev.mysql.com/doc/refman/en/optimizer-hints.html для получения дополнительной информации.

supports_transaction_isolation?() Показать исходный код
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 79
def supports_transaction_isolation?
  true
end
supports_views?() Показать исходный код
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 103
def supports_views?
  true
end
supports_virtual_columns?() Показать исходный код
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 111
def supports_virtual_columns?
  mariadb? || database_version >= "5.7.5"
end

© 2004–2020 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API