Skip to content

Instantly share code, notes, and snippets.

@vjt
Last active July 20, 2018 16:48
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save vjt/4548844 to your computer and use it in GitHub Desktop.
Save vjt/4548844 to your computer and use it in GitHub Desktop.
Rails SQL schema load support for PostgreSQL. Put both files in `lib/tasks`.
import File.expand_path(File.dirname(__FILE__) + '/schema_format.rb')
namespace :db do
# Define PG environment utility methods
task :pg_env => :environment do
def pg_get_config
ActiveRecord::Base.configurations.fetch(Rails.env).tap do |config|
ENV['PGHOST'] = config['host'].to_s if config.key?('host')
ENV['PGPORT'] = config['port'].to_s if config.key?('port')
ENV['PGPASSWORD'] = config['password'].to_s if config.key?('password')
end
end
def pg_make_dump(target, username, database)
%x( pg_dump -f #{target} -c -U #{username} #{database} )
end
def pg_load_dump(source, username, database, template = nil)
%x( psql -U "#{username}" -f #{source} #{database} #{template} )
end
end
namespace :structure do
desc "Load structure.sql file into the current environment's database"
task :load => :pg_env do
# Loads the db/structure.sql file into current environment's database.
#
pg_load_dump Rails.root.join('db/structure.sql').to_s,
*pg_get_config.values_at('username', 'database', 'template')
end
end
namespace :data do
desc "Save a dump of the database in db/data.NOW.sql"
task :dump => :pg_env do
target = Rails.root.join('db', "data.#{Time.now.to_f}.sql")
print "** Dumping data to #{target}..."
pg_make_dump target, *pg_get_config.values_at('username', 'database')
puts 'done'
end
desc "Load a dump of the database from ENV['DUMP']"
task :load => :pg_env do
source = ENV['DUMP'].presence or
raise ArgumentError, "Invoke as rake db:data:load DUMP=/path/to/data.sql"
print "**Restoring data from #{source}..."
pg_load_dump source, *pg_get_config.values_at('username', 'database')
puts 'done'
end
end
end
# h/t http://stackoverflow.com/questions/4698467
#
if Rails.application.config.active_record.schema_format == :sql
Rake::Task['db:schema:dump'].clear.enhance(['environment']) do
Rake::Task['db:structure:dump'].invoke
end
Rake::Task['db:schema:load'].clear.enhance(['environment']) do
Rake::Task['db:structure:load'].invoke
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment