The MySQL adapter will work with both Ruby/MySQL, which is a Ruby-based MySQL adapter that comes bundled with Active Record, and with the faster C-based MySQL/Ruby adapter (available both as a gem and from www.tmtm.org/en/mysql/ruby/).
Options:
-
:host
- Defaults to “localhost”. -
:port
- Defaults to 3306. -
:socket
- Defaults to “/tmp/mysql.sock”. -
:username
- Defaults to “root” -
:password
- Defaults to nothing. -
:database
- The name of the database. No default, must be provided. -
:encoding
- (Optional) Sets the client encoding by executing “SET NAMES <encoding>” after connection. -
:reconnect
- Defaults to false (See MySQL documentation: dev.mysql.com/doc/refman/5.0/en/auto-reconnect.html). -
:sslca
- Necessary to use MySQL with an SSL connection. -
:sslkey
- Necessary to use MySQL with an SSL connection. -
:sslcert
- Necessary to use MySQL with an SSL connection. -
:sslcapath
- Necessary to use MySQL with an SSL connection. -
:sslcipher
- Necessary to use MySQL with an SSL connection.
- A
- C
- D
- E
- L
- N
- P
- Q
- R
- S
- T
ADAPTER_NAME | = | 'MySQL' |
LOST_CONNECTION_ERROR_MESSAGES | = | [ "Server shutdown in progress", "Broken pipe", "Lost connection to MySQL server during query", "MySQL server has gone away" ] |
QUOTED_FALSE | = | '1', '0' |
NATIVE_DATABASE_TYPES | = | { :primary_key => "int(11) DEFAULT NULL auto_increment PRIMARY KEY", :string => { :name => "varchar", :limit => 255 }, :text => { :name => "text" }, :integer => { :name => "int", :limit => 4 }, :float => { :name => "float" }, :decimal => { :name => "decimal" }, :datetime => { :name => "datetime" }, :timestamp => { :name => "datetime" }, :time => { :name => "time" }, :date => { :name => "date" }, :binary => { :name => "blob" }, :boolean => { :name => "tinyint", :limit => 1 } } |
ENCODINGS | = | { "armscii8" => nil, "ascii" => Encoding::US_ASCII, "big5" => Encoding::Big5, "binary" => Encoding::ASCII_8BIT, "cp1250" => Encoding::Windows_1250, "cp1251" => Encoding::Windows_1251, "cp1256" => Encoding::Windows_1256, "cp1257" => Encoding::Windows_1257, "cp850" => Encoding::CP850, "cp852" => Encoding::CP852, "cp866" => Encoding::IBM866, "cp932" => Encoding::Windows_31J, "dec8" => nil, "eucjpms" => Encoding::EucJP_ms, "euckr" => Encoding::EUC_KR, "gb2312" => Encoding::EUC_CN, "gbk" => Encoding::GBK, "geostd8" => nil, "greek" => Encoding::ISO_8859_7, "hebrew" => Encoding::ISO_8859_8, "hp8" => nil, "keybcs2" => nil, "koi8r" => Encoding::KOI8_R, "koi8u" => Encoding::KOI8_U, "latin1" => Encoding::ISO_8859_1, "latin2" => Encoding::ISO_8859_2, "latin5" => Encoding::ISO_8859_9, "latin7" => Encoding::ISO_8859_13, "macce" => Encoding::MacCentEuro, "macroman" => Encoding::MacRoman, "sjis" => Encoding::SHIFT_JIS, "swe7" => nil, "tis620" => Encoding::TIS_620, "ucs2" => Encoding::UTF_16BE, "ujis" => Encoding::EucJP_ms, "utf8" => Encoding::UTF_8, "utf8mb4" => Encoding::UTF_8, } |
Taken from here: https://github.com/tmtm/ruby-mysql/blob/master/lib/mysql/charset.rb Author: TOMITA Masahiro <tommy@tmtm.org> |
By default, the MysqlAdapter will consider
all columns of type tinyint(1)
as boolean. If you wish to
disable this emulation (which was the default behavior in versions 0.13.1
and earlier) you can add the following line to your application.rb file:
ActiveRecord::ConnectionAdapters::MysqlAdapter.emulate_booleans = false
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 160 cattr_accessor :emulate_booleans
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 220 def initialize(connection, logger, connection_options, config) super(connection, logger) @connection_options, @config = connection_options, config @quoted_column_names, @quoted_table_names = {}, {} @statements = {} @statements = StatementPool.new(@connection, config.fetch(:statement_limit) { 1000 }) @client_encoding = nil connect end
CONNECTION MANAGEMENT ====================================
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 323 def active? if @connection.respond_to?(:stat) @connection.stat else @connection.query 'select 1' end # mysql-ruby doesn't raise an exception when stat fails. if @connection.respond_to?(:errno) @connection.errno.zero? else true end rescue Mysql::Error false end
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 701 def add_column(table_name, column_name, type, options = {}) execute("ALTER TABLE #{quote_table_name(table_name)} #{add_column_sql(table_name, column_name, type, options)}") end
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 742 def add_column_position!(sql, options) if options[:first] sql << " FIRST" elsif options[:after] sql << " AFTER #{quote_column_name(options[:after])}" end end
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 773 def case_sensitive_equality_operator "= BINARY" end
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 778 def case_sensitive_modifier(node) Arel::Nodes::Bin.new(node) end
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 710 def change_column_null(table_name, column_name, null, default = nil) column = column_for(table_name, column_name) unless null || default.nil? execute("UPDATE #{quote_table_name(table_name)} SET #{quote_column_name(column_name)}=#{quote(default)} WHERE #{quote_column_name(column_name)} IS NULL") end change_column table_name, column_name, column.sql_type, :null => null end
Returns the database character set.
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 612 def charset show_variable 'character_set_database' end
Clears the prepared statements cache.
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 371 def clear_cache! @statements.clear end
Get the client encoding for this database
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 423 def client_encoding return @client_encoding if @client_encoding result = exec_query( "SHOW VARIABLES WHERE Variable_name = 'character_set_client'", 'SCHEMA') @client_encoding = ENCODINGS[result.rows.last.last] end
Returns the database collation strategy.
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 617 def collation show_variable 'collation_database' 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
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 591 def create_database(name, options = {}) if options[:collation] execute "CREATE DATABASE `#{name}` DEFAULT CHARACTER SET `#{options[:charset] || 'utf8'}` COLLATE `#{options[:collation]}`" else execute "CREATE DATABASE `#{name}` DEFAULT CHARACTER SET `#{options[:charset] || 'utf8'}`" end end
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 515 def create_savepoint execute("SAVEPOINT #{current_savepoint_name}") end
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 607 def current_database select_value 'SELECT DATABASE() as db' end
Disconnects from the database if already connected. Otherwise, this method does nothing.
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 348 def disconnect! @connection.close rescue nil end
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 642 def drop_table(table_name, options = {}) super(table_name, options) end
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 488 def exec_delete(sql, name, binds) log(sql, name, binds) do exec_stmt(sql, name, binds) do |cols, stmt| stmt.affected_rows end end end
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 432 def exec_query(sql, name = 'SQL', binds = []) log(sql, name, binds) do exec_stmt(sql, name, binds) do |cols, stmt| ActiveRecord::Result.new(cols, stmt.to_a) if cols end end end
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 440 def last_inserted_id(result) @connection.insert_id end
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 782 def limited_update_conditions(where_sql, quoted_table_name, quoted_primary_key) where_sql end
Returns just a table’s primary key
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 768 def primary_key(table) pk_and_sequence = pk_and_sequence_for(table) pk_and_sequence && pk_and_sequence.first end
QUOTING ==================================================
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 271 def quote(value, column = nil) if value.kind_of?(String) && column && column.type == :binary && column.class.respond_to?(:string_to_binary) s = column.class.string_to_binary(value).unpack("H*")[0] "x'#{s}'" elsif value.kind_of?(BigDecimal) value.to_s("F") else super end end
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 304 def quoted_false QUOTED_FALSE end
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 300 def quoted_true QUOTED_TRUE end
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 340 def reconnect! disconnect! clear_cache! connect end
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 523 def release_savepoint execute("RELEASE SAVEPOINT #{current_savepoint_name}") end
Renames a table.
Example:
rename_table('octopuses', 'octopi')
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 682 def rename_table(table_name, new_name) execute "RENAME TABLE #{quote_table_name(table_name)} TO #{quote_table_name(new_name)}" end
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 352 def reset! if @connection.respond_to?(:change_user) # See http://bugs.mysql.com/bug.php?id=33540 -- the workaround way to # reset the connection is to change the user to the same user. @connection.change_user(@config[:username], @config[:password], @config[:database]) configure_connection end end
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 519 def rollback_to_savepoint execute("ROLLBACK TO SAVEPOINT #{current_savepoint_name}") end
DATABASE STATEMENTS ======================================
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 363 def select_rows(sql, name = nil) @connection.query_with_result = true rows = exec_without_stmt(sql, name).rows @connection.more_results && @connection.next_result # invoking stored procedures with CLIENT_MULTI_RESULTS requires this to tidy up else connection will be dropped rows end
SHOW VARIABLES LIKE ‘name’
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 751 def show_variable(name) variables = select_all("SHOW VARIABLES LIKE '#{name}'") variables.first['Value'] unless variables.empty? end
Returns true, since this connection adapter supports prepared statement caching.
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 245 def supports_statement_cache? true end
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 628 def table_exists?(name) return true if super name = name.to_s schema, table = name.split('.', 2) unless table # A table was provided without a schema table = schema schema = nil end tables(nil, schema).include? table end
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 282 def type_cast(value, column) return super unless value == true || value == false value ? 1 : 0 end
Maps logical Rails types to MySQL-specific data types.
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 729 def type_to_sql(type, limit = nil, precision = nil, scale = nil) return super unless type.to_s == 'integer' case limit when 1; 'tinyint' when 2; 'smallint' when 3; 'mediumint' when nil, 4, 11; 'int(11)' # compatibility with MySQL default when 5..8; 'bigint' else raise(ActiveRecordError, "No integer type has byte size #{limit}") end end
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 813 def add_column_sql(table_name, column_name, type, options = {}) add_column_sql = "ADD #{quote_column_name(column_name)} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}" add_column_options!(add_column_sql, options) add_column_position!(add_column_sql, options) add_column_sql end
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 858 def add_index_sql(table_name, column_name, options = {}) index_name, index_type, index_columns = add_index_options(table_name, column_name, options) "ADD #{index_type} INDEX #{index_name} (#{index_columns})" end
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 868 def add_timestamps_sql(table_name) [add_column_sql(table_name, :created_at, :datetime), add_column_sql(table_name, :updated_at, :datetime)] end
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 825 def change_column_sql(table_name, column_name, type, options = {}) column = column_for(table_name, column_name) unless options_include_default?(options) options[:default] = column.default end unless options.has_key?(:null) options[:null] = column.null end change_column_sql = "CHANGE #{quote_column_name(column_name)} #{quote_column_name(column_name)} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}" add_column_options!(change_column_sql, options) add_column_position!(change_column_sql, options) change_column_sql end
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 787 def quoted_columns_for_index(column_names, options = {}) length = options[:length] if options.is_a?(Hash) case length when Hash column_names.map {|name| length[name] ? "#{quote_column_name(name)}(#{length[name]})" : quote_column_name(name) } when Fixnum column_names.map {|name| "#{quote_column_name(name)}(#{length})"} else column_names.map {|name| quote_column_name(name) } end end
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 820 def remove_column_sql(table_name, *column_names) columns_for_remove(table_name, *column_names).map {|column_name| "DROP #{column_name}" } end
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 863 def remove_index_sql(table_name, options = {}) index_name = index_name_for_remove(table_name, options) "DROP INDEX #{index_name}" end
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 872 def remove_timestamps_sql(table_name) [remove_column_sql(table_name, :updated_at), remove_column_sql(table_name, :created_at)] end
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 842 def rename_column_sql(table_name, column_name, new_column_name) options = {} if column = columns(table_name).find { |c| c.name == column_name.to_s } options[:default] = column.default options[:null] = column.null else raise ActiveRecordError, "No such column: #{table_name}.#{column_name}" end current_type = select_one("SHOW COLUMNS FROM #{quote_table_name(table_name)} LIKE '#{column_name}'")["Type"] rename_column_sql = "CHANGE #{quote_column_name(column_name)} #{quote_column_name(new_column_name)} #{current_type}" add_column_options!(rename_column_sql, options) rename_column_sql end
Source: show
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 800 def translate_exception(exception, message) return super unless exception.respond_to?(:errno) case exception.errno when 1062 RecordNotUnique.new(message, exception) when 1452 InvalidForeignKey.new(message, exception) else super end end