Created
February 17, 2012 10:16
-
-
Save jmgarnier/1852455 to your computer and use it in GitHub Desktop.
Fast rename columns for MYSQL, very handy for huge tables
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class ActiveRecord::Migration | |
def self.fast_add_columns(table_name, new_columns_count) | |
tmp_table_name = "#{table_name}_tmp" | |
execute "DROP TABLE IF EXISTS #{tmp_table_name}" | |
execute "CREATE TABLE #{tmp_table_name} LIKE #{table_name}" | |
yield tmp_table_name | |
execute("INSERT INTO #{tmp_table_name} SELECT * #{', NULL' * new_columns_count} FROM #{table_name}") | |
drop_table table_name | |
rename_table tmp_table_name, table_name | |
end | |
def self.backup(table_name) | |
backup_table_name = "#{table_name}_backup" | |
execute "DROP TABLE IF EXISTS #{backup_table_name}" | |
execute "CREATE TABLE #{backup_table_name} LIKE #{table_name}" | |
execute("INSERT INTO #{backup_table_name} SELECT * FROM #{table_name}") | |
end | |
def self.restore(table_name) | |
backup_table_name = "#{table_name}_backup" | |
drop_table(table_name) if table_exists?(table_name) | |
rename_table backup_table_name, table_name | |
execute "DROP TABLE IF EXISTS #{backup_table_name}" | |
end | |
def self.table_exists?(name) | |
ActiveRecord::Base.connection.tables.include?(name) | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Cool! Thanks!