# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 559 def primary_key(table) pk_and_sequence = pk_and_sequence_for(table) pk_and_sequence && pk_and_sequence.first end
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.
- active?
- add_column
- add_column_position!
- case_sensitive_equality_operator
- change_column_null
- charset
- collation
- create_database
- create_savepoint
- current_database
- disconnect!
- drop_table
- emulate_booleans
- limited_update_conditions
- new
- primary_key
- quote
- quoted_columns_for_index
- quoted_false
- quoted_true
- reconnect!
- release_savepoint
- rename_table
- reset!
- rollback_to_savepoint
- select_rows
- show_variable
- table_exists?
- translate_exception
- type_to_sql
ADAPTER_NAME | = | 'MySQL'.freeze |
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'.freeze, '0'.freeze |
NATIVE_DATABASE_TYPES | = | { :primary_key => "int(11) DEFAULT NULL auto_increment PRIMARY KEY".freeze, :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 } } |
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
[ show source ]
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 132 cattr_accessor :emulate_booleans
[ show source ]
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 160 def initialize(connection, logger, connection_options, config) super(connection, logger) @connection_options, @config = connection_options, config @quoted_column_names, @quoted_table_names = {}, {} connect end
CONNECTION MANAGEMENT ====================================
[ show source ]
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 236 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
[ show source ]
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 466 def add_column(table_name, column_name, type, options = {}) add_column_sql = "ALTER TABLE #{quote_table_name(table_name)} 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) execute(add_column_sql) end
[ show source ]
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 533 def add_column_position!(sql, options) if options[:first] sql << " FIRST" elsif options[:after] sql << " AFTER #{quote_column_name(options[:after])}" end end
[ show source ]
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 564 def case_sensitive_equality_operator "= BINARY" end
[ show source ]
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 478 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.
[ show source ]
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 396 def charset show_variable 'character_set_database' end
Returns the database collation strategy.
[ show source ]
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 401 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
[ show source ]
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 379 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
[ show source ]
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 328 def create_savepoint execute("SAVEPOINT #{current_savepoint_name}") end
[ show source ]
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 391 def current_database select_value 'SELECT DATABASE() as db' end
[ show source ]
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 258 def disconnect! @connection.close rescue nil end
[ show source ]
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 427 def drop_table(table_name, options = {}) super(table_name, options) end
[ show source ]
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 568 def limited_update_conditions(where_sql, quoted_table_name, quoted_primary_key) where_sql end
Returns just a table’s primary key
[ show source ]
QUOTING ==================================================
[ show source ]
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 190 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
[ show source ]
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 217 def quoted_false QUOTED_FALSE end
[ show source ]
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 213 def quoted_true QUOTED_TRUE end
[ show source ]
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 253 def reconnect! disconnect! connect end
[ show source ]
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 336 def release_savepoint execute("RELEASE SAVEPOINT #{current_savepoint_name}") end
[ show source ]
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 462 def rename_table(table_name, new_name) execute "RENAME TABLE #{quote_table_name(table_name)} TO #{quote_table_name(new_name)}" end
[ show source ]
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 262 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
[ show source ]
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 332 def rollback_to_savepoint execute("ROLLBACK TO SAVEPOINT #{current_savepoint_name}") end
DATABASE STATEMENTS ======================================
[ show source ]
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 273 def select_rows(sql, name = nil) @connection.query_with_result = true result = execute(sql, name) rows = [] result.each { |row| rows << row } result.free @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’
[ show source ]
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 542 def show_variable(name) variables = select_all("SHOW VARIABLES LIKE '#{name}'") variables.first['Value'] unless variables.empty? end
[ show source ]
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 413 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
Maps logical Rails types to MySQL-specific data types.
[ show source ]
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 520 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
[ show source ]
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 573 def quoted_columns_for_index(column_names, options = {}) length = options[:length] if options.is_a?(Hash) quoted_column_names = 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
[ show source ]
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 586 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