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.
- :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.
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 environment.rb file:
ActiveRecord::ConnectionAdapters::MysqlAdapter.emulate_booleans = false
- active?
- charset
- collation
- create_database
- current_database
- disconnect!
- drop_table
- new
- quote
- quoted_false
- quoted_true
- reconnect!
- rename_table
- select_rows
- show_variable
- type_to_sql
| 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' |
[ show source ]
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 184
184: def initialize(connection, logger, connection_options, config)
185: super(connection, logger)
186: @connection_options, @config = connection_options, config
187: @quoted_column_names, @quoted_table_names = {}, {}
188: connect
189: end
CONNECTION MANAGEMENT ====================================
[ show source ]
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 265
265: def active?
266: if @connection.respond_to?(:stat)
267: @connection.stat
268: else
269: @connection.query 'select 1'
270: end
271:
272: # mysql-ruby doesn't raise an exception when stat fails.
273: if @connection.respond_to?(:errno)
274: @connection.errno.zero?
275: else
276: true
277: end
278: rescue Mysql::Error
279: false
280: end
Returns the database character set.
[ show source ]
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 398
398: def charset
399: show_variable 'character_set_database'
400: end
Returns the database collation strategy.
[ show source ]
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 403
403: def collation
404: show_variable 'collation_database'
405: 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 lib/active_record/connection_adapters/mysql_adapter.rb, line 381
381: def create_database(name, options = {})
382: if options[:collation]
383: execute "CREATE DATABASE `#{name}` DEFAULT CHARACTER SET `#{options[:charset] || 'utf8'}` COLLATE `#{options[:collation]}`"
384: else
385: execute "CREATE DATABASE `#{name}` DEFAULT CHARACTER SET `#{options[:charset] || 'utf8'}`"
386: end
387: end
[ show source ]
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 393
393: def current_database
394: select_value 'SELECT DATABASE() as db'
395: end
[ show source ]
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 287
287: def disconnect!
288: @connection.close rescue nil
289: end
[ show source ]
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 413
413: def drop_table(table_name, options = {})
414: super(table_name, options)
415: end
QUOTING ==================================================
[ show source ]
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 219
219: def quote(value, column = nil)
220: if value.kind_of?(String) && column && column.type == :binary && column.class.respond_to?(:string_to_binary)
221: s = column.class.string_to_binary(value).unpack("H*")[0]
222: "x'#{s}'"
223: elsif value.kind_of?(BigDecimal)
224: "'#{value.to_s("F")}'"
225: else
226: super
227: end
228: end
[ show source ]
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 246
246: def quoted_false
247: QUOTED_FALSE
248: end
[ show source ]
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 242
242: def quoted_true
243: QUOTED_TRUE
244: end
[ show source ]
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 282
282: def reconnect!
283: disconnect!
284: connect
285: end
[ show source ]
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 443
443: def rename_table(table_name, new_name)
444: execute "RENAME TABLE #{quote_table_name(table_name)} TO #{quote_table_name(new_name)}"
445: end
DATABASE STATEMENTS ======================================
[ show source ]
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 294
294: def select_rows(sql, name = nil)
295: @connection.query_with_result = true
296: result = execute(sql, name)
297: rows = []
298: result.each { |row| rows << row }
299: result.free
300: rows
301: end
SHOW VARIABLES LIKE ‘name‘
[ show source ]
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 496
496: def show_variable(name)
497: variables = select_all("SHOW VARIABLES LIKE '#{name}'")
498: variables.first['Value'] unless variables.empty?
499: end
Maps logical Rails types to MySQL-specific data types.
[ show source ]
# File lib/active_record/connection_adapters/mysql_adapter.rb, line 481
481: def type_to_sql(type, limit = nil, precision = nil, scale = nil)
482: return super unless type.to_s == 'integer'
483:
484: case limit
485: when 1; 'tinyint'
486: when 2; 'smallint'
487: when 3; 'mediumint'
488: when nil, 4, 11; 'int(11)' # compatibility with MySQL default
489: when 5..8; 'bigint'
490: else raise(ActiveRecordError, "No integer type has byte size #{limit}")
491: end
492: end