Skip to content

Instantly share code, notes, and snippets.

@jmgarnier
Created February 17, 2012 10:16
Show Gist options
  • Save jmgarnier/1852455 to your computer and use it in GitHub Desktop.
Save jmgarnier/1852455 to your computer and use it in GitHub Desktop.
Fast rename columns for MYSQL, very handy for huge tables
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
@pcreux
Copy link

pcreux commented Feb 17, 2012

Cool! Thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment