Got tired of having to manually drop tables when working on migrations

Posted by jpb Thu, 15 Jun 2006 06:16:00 GMT

I kept having typos in my migrations, and it turned out to be easier to just zap all the tables and re-run rake migrate than to undo just enough of the migration to get the db back to the way the migration was expecting.

Anyway, so I wrote this wipedb script that reads database.yml so you don’t need to maintain the database user & password in multiple places.


#! /usr/bin/env ruby
#
# $Id: wipedb 1171 2006-06-10 16:36:57Z jpb $
#
# Copyright 2006 J. P. Block <jpb@ApesSeekingKnowledge.net>

require 'ostruct'
require 'optparse'
require 'yaml'

class MyArgs
  MODENAMES = %w[development test production]

  # return structure showing what opts were picked

  def self.parse(args)
    options = OpenStruct.new
    options.mode = 'development'
    options.debug = 0

    opts = OptionParser.new do |opts|
      opts.banner = "Usage: script/wipedb [options]" 
      opts.separator "" 
      opts.separator "Specific options:" 
      mode_list = MODENAMES.join(',')
      opts.on("-m MODENAME", "--mode MODENAME", MODENAMES, "Select mode",
                      "  (#{mode_list})") do |the_mode|
        options.mode = the_mode
      end
      opts.on("-d", "--debug", "Turn on debug") do
        options.debug = 1
      end
      opts.on_tail("-h", "--help", "Show this message") do
        puts opts
        exit
      end

      opts.on_tail("--version", "Show version") do
        puts "$Id: wipedb 1171 2006-06-10 16:36:57Z jpb $" 
        exit
      end
    end

    opts.parse!(args)
    options
  end # parse()
end

options = MyArgs.parse(ARGV)

mode = options.mode

config = YAML.load_file('config/database.yml')

database = config[options.mode]['database']
host = config[options.mode]['host']
password = config[options.mode]['password']
username = config[options.mode]['username']

if options.debug == 1:  
  puts "mode: #{mode}" 
  puts "database: #{database}" 
  puts "host: #{host}" 
  puts "username: #{username}" 
  puts "password: #{password}" 
end

zap_list = `mysqldump -u #{username} -p#{password} --complete-insert --add-drop-table --quick --single-transaction #{database} | grep DROP`

zapper = IO.popen("mysql -u #{username} -p#{password} #{database}", "w+")
zap_list.each do |z|
  zapper.puts(z)
end
zapper.close_write


Posted in , ,  | Tags , , ,  | no comments

Comments

(leave url/email »)

   Preview comment