On this page
module ActiveRecord::ConnectionAdapters
Constants
- ER_CANNOT_ADD_FOREIGN
- ER_CANNOT_CREATE_TABLE
- ER_DATA_TOO_LONG
- ER_DO_NOT_HAVE_DEFAULT
- ER_DUP_ENTRY
-
See dev.mysql.com/doc/refman/5.7/en/error-messages-server.html
- ER_LOCK_DEADLOCK
- ER_NOT_NULL_VIOLATION
- ER_NO_REFERENCED_ROW_2
- ER_OUT_OF_RANGE
Public Class Methods
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 68
def initialize(connection, logger, connection_options, config)
super(connection, logger, config)
@statements = StatementPool.new(self.class.type_cast_config_to_integer(config[:statement_limit]))
if version < "5.1.10"
raise "Your version of MySQL (#{version_string}) is too old. Active Record supports MySQL >= 5.1.10."
end
end
Public Instance Methods
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 226
def begin_db_transaction
execute "BEGIN"
end
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 230
def begin_isolated_db_transaction(isolation)
execute "SET TRANSACTION ISOLATION LEVEL #{transaction_isolation_levels.fetch(isolation)}"
begin_db_transaction
end
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 298
def charset
show_variable "character_set_database"
end
Returns the database character set.
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 192
def clear_cache!
reload_type_map
@statements.clear
end
Clears the prepared statements cache.
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 303
def collation
show_variable "collation_database"
end
Returns the database collation strategy.
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 277
def create_database(name, options = {})
if options[:collation]
execute "CREATE DATABASE #{quote_table_name(name)} DEFAULT CHARACTER SET #{quote_table_name(options[:charset] || 'utf8')} COLLATE #{quote_table_name(options[:collation])}"
else
execute "CREATE DATABASE #{quote_table_name(name)} DEFAULT CHARACTER SET #{quote_table_name(options[:charset] || 'utf8')}"
end
end
Create a new MySQL database with optional :charset and :collation. Charset defaults to utf8.
Example:
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 293
def current_database
query_value("SELECT database()", "SCHEMA")
end
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 405
def drop_table(table_name, options = {})
execute "DROP#{' TEMPORARY' if options[:temporary]} TABLE#{' IF EXISTS' if options[:if_exists]} #{quote_table_name(table_name)}#{' CASCADE' if options[:force] == :cascade}"
end
Drops a table from the database.
:force-
Set to
:cascadeto drop dependent objects as well. Defaults to false. :if_exists-
Set to
trueto only drop the table if it exists. Defaults to false. :temporary-
Set to
trueto drop temporary table. Defaults to false.
Although this command ignores most options and the block if one is given, it can be helpful to provide these in a migration's change method so it can be reverted. In that case, options and the block will be used by create_table.
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 255
def empty_insert_statement_value
"VALUES ()"
end
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 211
def execute(sql, name = nil)
log(sql, name) do
ActiveSupport::Dependencies.interlock.permit_concurrent_loads do
@connection.query(sql)
end
end
end
Executes the SQL statement in the context of this connection.
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 201
def explain(arel, binds = [])
sql = "EXPLAIN #{to_sql(arel, binds)}"
start = Time.now
result = exec_query(sql, "EXPLAIN", binds)
elapsed = Time.now - start
MySQL::ExplainPrettyPrinter.new.pp(result, elapsed)
end
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 455
def foreign_keys(table_name)
raise ArgumentError unless table_name.present?
scope = quoted_scope(table_name)
fk_info = exec_query(" 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]}
".strip_heredoc, "SCHEMA")
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
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 154
def index_algorithms
{ default: "ALGORITHM = DEFAULT", copy: "ALGORITHM = COPY", inplace: "ALGORITHM = INPLACE" }
end
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 150
def native_database_types
NATIVE_DATABASE_TYPES
end
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 263
def recreate_database(name, options = {})
drop_database(name)
sql = create_database(name, options)
reconnect!
sql
end
Drops the database specified on the name attribute and creates it again using the provided options.
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 409
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 385
def rename_table(table_name, new_name)
execute "RENAME TABLE #{quote_table_name(table_name)} TO #{quote_table_name(new_name)}"
rename_table_indexes(table_name, new_name)
end
Renames a table.
Example:
rename_table('octopuses', 'octopi')
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 537
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 586
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 138
def supports_advisory_locks?
true
end
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 122
def supports_datetime_with_precision?
if mariadb?
version >= "5.3.0"
else
version >= "5.6.4"
end
end
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 106
def supports_explain?
true
end
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 114
def supports_foreign_keys?
true
end
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 98
def supports_index_sort_order?
true
end
Technically MySQL allows to create indexes with the sort order syntax but at the moment (5.5) it doesn't yet implement them
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 110
def supports_indexes_in_create?
true
end
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 92
def supports_statement_cache?
true
end
Returns true, since this connection adapter supports prepared statement caching.
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 102
def supports_transaction_isolation?
true
end
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 118
def supports_views?
true
end
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 130
def supports_virtual_columns?
if mariadb?
version >= "5.2.0"
else
version >= "5.7.5"
end
end
# File activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb, line 307
def truncate(table_name, name = nil)
execute "TRUNCATE TABLE #{quote_table_name(table_name)}", name
end
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.