класс ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter
Константы
- CR_SERVER_GONE_ERROR
- CR_SERVER_LOST
- EMULATE_BOOLEANS_TRUE
- ER_CANNOT_ADD_FOREIGN
- ER_CANNOT_CREATE_TABLE
- ER_CLIENT_INTERACTION_TIMEOUT
- ER_CONNECTION_KILLED
- 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
- ER_SERVER_SHUTDOWN
- EXTENDED_TYPE_MAPS
- NATIVE_DATABASE_TYPES
Публичные методы класса
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 57
def dbconsole(config, options = {})
mysql_config = config.configuration_hash
args = {
host: "--host",
port: "--port",
socket: "--socket",
username: "--user",
encoding: "--default-character-set",
sslca: "--ssl-ca",
sslcert: "--ssl-cert",
sslcapath: "--ssl-capath",
sslcipher: "--ssl-cipher",
sslkey: "--ssl-key",
ssl_mode: "--ssl-mode"
}.filter_map { |opt, arg| "#{arg}=#{mysql_config[opt]}" if mysql_config[opt] }
if mysql_config[:password] && options[:include_password]
args << "--password=#{mysql_config[:password]}"
elsif mysql_config[:password] && !mysql_config[:password].to_s.empty?
args << "-p"
end
args << config.database
find_cmd_and_exec(["mysql", "mysql5"], *args)
end # File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 29 class_attribute :emulate_booleans, default: true
По умолчанию, Mysql2Adapter будет рассматривать все столбцы типа tinyint(1) как булевы. Если вы хотите отключить эту эмуляцию, вы можете добавить следующую строку в ваш файл application.rb:
ActiveRecord::ConnectionAdapters::Mysql2Adapter.emulate_booleans = false
Общедоступные методы экземпляра
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 308 def charset show_variable "character_set_database" end
Возвращает кодировку символов базы данных.
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 513
def check_constraints(table_name)
if supports_check_constraints?
scope = quoted_scope(table_name)
sql = <<~SQL
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
sql += " AND cc.table_name = #{scope[:name]}" if mariadb?
chk_info = internal_exec_query(sql, "SCHEMA")
chk_info.map do |row|
options = {
name: row["name"]
}
expression = row["expression"]
expression = expression[1..-2] if expression.start_with?("(") && expression.end_with?(")")
expression = strip_whitespace_characters(expression)
unless mariadb?
# MySQL returns check constraints expression in an already escaped form.
# This leads to duplicate escaping later (e.g. when the expression is used in the SchemaDumper).
expression = expression.gsub("\\'", "'")
end
CheckConstraintDefinition.new(table_name, expression, options)
end
else
raise NotImplementedError
end
end # File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 313 def collation show_variable "collation_database" end
Возвращает стратегию сортировки базы данных.
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 283
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
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 303
def current_database
query_value("SELECT database()", "SCHEMA")
end # File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 361
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.
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 468
def foreign_keys(table_name)
raise ArgumentError unless table_name.present?
scope = quoted_scope(table_name)
# MySQL returns 1 row for each column of composite foreign keys.
fk_info = internal_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',
fk.ordinal_position AS 'position',
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
grouped_fk = fk_info.group_by { |row| row["name"] }.values.each { |group| group.sort_by! { |row| row["position"] } }
grouped_fk.map do |group|
row = group.first
options = {
name: row["name"],
on_update: extract_foreign_key_action(row["on_update"]),
on_delete: extract_foreign_key_action(row["on_delete"])
}
if group.one?
options[:column] = unquote_identifier(row["column"])
options[:primary_key] = row["primary_key"]
else
options[:column] = group.map { |row| unquote_identifier(row["column"]) }
options[:primary_key] = group.map { |row| row["primary_key"] }
end
ForeignKeyDefinition.new(table_name, unquote_identifier(row["to_table"]), options)
end
end # File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 189
def index_algorithms
{
default: "ALGORITHM = DEFAULT",
copy: "ALGORITHM = COPY",
inplace: "ALGORITHM = INPLACE",
instant: "ALGORITHM = INSTANT",
}
end # File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 185 def native_database_types NATIVE_DATABASE_TYPES end
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 692
def quote_string(string)
with_raw_connection(allow_retry: true, materialize_transactions: false) do |connection|
connection.escape(string)
end
end Приводит строки в формат, используемый в SQL-запросах.
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 269
def recreate_database(name, options = {})
drop_database(name)
sql = create_database(name, options)
reconnect!
sql
end Удаляет базу данных, указанную в атрибуте name, и создаёт её снова с использованием предоставленных options.
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 366
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 # File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 338
def rename_table(table_name, new_name, **options)
validate_table_length!(new_name) unless options[:_uses_legacy_table_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, **options)
end Переименовывает таблицу.
Пример:
rename_table('octopuses', 'octopi')
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 582
def show_variable(name)
query_value("SELECT @@#{name}", "SCHEMA")
rescue ActiveRecord::StatementInvalid
nil
end SHOW VARIABLES LIKE ‘name’
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 633 def strict_mode? self.class.type_cast_config_to_boolean(@config.fetch(:strict, true)) end
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 161 def supports_advisory_locks? true end
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 96 def supports_bulk_alter? true end
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 128
def supports_check_constraints?
if mariadb?
database_version >= "10.3.10" || (database_version < "10.3" && database_version >= "10.2.22")
else
database_version >= "8.0.16"
end
end # File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 153
def supports_common_table_expressions?
if mariadb?
database_version >= "10.2.1"
else
database_version >= "8.0.1"
end
end # File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 140 def supports_datetime_with_precision? mariadb? || database_version >= "5.6.4" end
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 116 def supports_explain? true end
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 104 def supports_expression_index? !mariadb? && database_version >= "8.0.13" end
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 124 def supports_foreign_keys? true end
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 100 def supports_index_sort_order? !mariadb? && database_version >= "8.0.1" end
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 120 def supports_indexes_in_create? true end
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 165 def supports_insert_on_duplicate_skip? true end
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 169 def supports_insert_on_duplicate_update? true end
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 173 def supports_insert_returning? mariadb? && database_version >= "10.5.0" end
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 149 def supports_optimizer_hints? !mariadb? && database_version >= "5.7.7" end
См. dev.mysql.com/doc/refman/en/optimizer-hints.html для получения более подробной информации.
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 112 def supports_restart_db_transaction? true end
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 108 def supports_transaction_isolation? true end
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 136 def supports_views? true end
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 144 def supports_virtual_columns? mariadb? || database_version >= "5.7.5" end
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.