先说一下在Netbeans中Rails开发时如何备份和恢复MySQL数据库。
mccxj 给的的方法不错,在开发的时候整理数据库还不错,如果数据库比较复杂,或者不习惯写夹具的话。
在#{RAILS_ROOT}/lib/tasks下建立db.rake,把mccxj给的代码拷贝进去,然后按Alt+Shift+R调出运行Rake任务的对话框,点“刷新任务”按钮,列表中会出来“db:backup:create”/“db:backup:destroy”/“db:backup:rebuild”三个任务,单击相应的任务就可以备份和恢复数据库。
下面示例说明如何在RAILS应用网页中备份和恢复MySQL数据库。
(1)建立控制器
[code="ruby"]ruby script/generate controller dbctl index backup restore/code编写Dbctl控制器代码
[code="ruby"]class DbctlController < ApplicationController
def index
@dt = Time.now
end
def backup
%x{rake db:backup:create}
redirect_to :action => :index
end
def restore
%x{rake db:backup:rebuild}
redirect_to :action => :index
end
end/code编写views/Dbctl/index.html.erb页面代码
[code="ruby"]
Dbc#index
<%= link_to 'backup', {:action=> 'backup'} %>
<%= link_to 'restore', {:action=> 'restore'} %>[/code]
运行你的应用程序就可以了。
说明几点:
Rails中可以用%x{SYSTEM COMMAND}命令运行系统命令,借助刚才建立的db.rake,可以使用rake db:backup:create创建数据库备份,使用rake db:backup:rebuild恢复数据库。
如果你没有建立db.rake,那么控制器代码就这么写
[code="ruby"]class DbcController < ApplicationController
def index
@dt = Time.now
end
def backup
backup_folder = File.join(ENV["DIR"] || "db", 'backup')
FileUtils.mkdir_p(backup_folder)
magic_date = (Date.parse(ENV["DATE"]) if ENV["DATE"]) || Time.now
backup_file = File.join(backup_folder, "#{RAILS_ENV}#{magic_date.strftime("%Y%m%d%H%M%S")}.sql")
db_config = ActiveRecord::Base.configurations[RAILS_ENV]
system "mysqldump -u #{db_config['username']} #{'-p' if db_config['password']}#{db_config['password']} --opt #{db_config['database']} > #{backup_file}"
redirect_to :action => :index
end
def restore
backup_folder = File.join(ENV["DIR"] || "db", 'backup')
FileUtils.mkdir_p(backup_folder)
db_config = ActiveRecord::Base.configurations[RAILS_ENV]
db_config = ActiveRecord::Base.configurations[RAILS_ENV]
bakfile = ENV'FILE'.entries - ['.', '..']).sort.reverse.each do |backup|
(bakfile = backup and break) if backup.starts_with?(RAILS_ENV)
end unless bakfile
raise 'could not find the backup file!' unless bakfile
ActiveRecord::Base.establish_connection(RAILS_ENV)
ActiveRecord::Base.connection.execute('SET foreign_key_checks = 0')
puts "rebuild database #{db_config['database']} from #{bakfile}"
system "mysql -u #{db_config['username']} #{'-p' if db_config['password']}#{db_config['password']} #{db_config['database']} < #{backup_folder}/#{bakfile}"
redirect_to :action => :index
end
end[/code]
这只是能实现你说的需求而已,但是实用性不高。