Skip to content

Instantly share code, notes, and snippets.

@AlexKalinin
Last active May 10, 2020 04:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AlexKalinin/f536c750649ae87d8130c8f6939ef563 to your computer and use it in GitHub Desktop.
Save AlexKalinin/f536c750649ae87d8130c8f6939ef563 to your computer and use it in GitHub Desktop.
MediumArticle: Implementing rake db:* tasks in Non-Rails script (postgres, activerecord) https://medium.com/@AlexKalininHedin/rake-db-tasks-in-non-rails-application-95aa65509448
#!/usr/bin/env ruby
require 'bundler'
Bundler.require(:default)
require 'active_support'
require 'active_record'
require 'pry'
@root_path = File.expand_path File.dirname(__FILE__)
@config = YAML.load_file(File.join(@root_path, 'config.yml'))
def drop_database
cfg = @config['db']
db_name = cfg['database']
cfg['database'] = 'postgres'
ActiveRecord::Base.establish_connection(cfg)
sql_drop_connections_to_dp = <<-SQL
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = '#{ db_name }';
SQL
sql_dropdb = <<-SQL
DROP DATABASE "#{ db_name }";
SQL
ActiveRecord::Base.connection.select_all sql_drop_connections_to_dp
ActiveRecord::Base.connection.select_all sql_dropdb
puts "Dropped database: #{ db_name }"
end
def create_database
cfg = @config['db']
db_name = cfg['database']
cfg['database'] = 'postgres'
ActiveRecord::Base.establish_connection(cfg)
sql_createdb = <<-SQL
CREATE DATABASE "#{ db_name }";
SQL
ActiveRecord::Base.connection.select_all sql_createdb
puts "Created database #{db_name}"
end
def migrate_database
cfg = @config['db']
db_name = cfg['database']
ActiveRecord::Base.establish_connection(cfg)
puts "Migrating database #{db_name} ..."
ActiveRecord::Migration.verbose = true
ActiveRecord::Tasks::DatabaseTasks.migrate
File.open('db/schema.rb', "w:utf-8") do |file|
ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
end
end
def rollback_database
raise "Environment variable VERSION is required" if !ENV["VERSION"] || ENV["VERSION"].empty?
cfg = @config['db']
db_name = cfg['database']
puts "Rolling back migration #{ ENV["VERSION"] } for database: #{db_name}..."
ActiveRecord::Base.establish_connection(cfg)
ActiveRecord::Tasks::DatabaseTasks.check_target_version
ActiveRecord::Base.connection.migration_context.run(
:down,
ActiveRecord::Tasks::DatabaseTasks.target_version
)
end
ALLOWED_ACTIONS = %w(drop create migrate recreate rollback).freeze
action = ALLOWED_ACTIONS.find {|e| e == ARGV[0]}
unless action
help_msg = <<-TXT
This is db helper.
USAGE:
ruby init_db.rb <action>
or
VERSION=202004281342 ruby init_db.rb rollback
OPTIONS:
possible <action>-s:
drop - drop existing database
crate - create new database
migrate - migrate database
recreate - drop,create,migrate
rollback - rollback migration
EXAMPLES:
ruby init_db.rb drop
ruby init_db.rb create
ruby init_db.rb migrate
VERSION=202004281342 ruby init_db.rb rollback
TXT
puts help_msg.gsub(' ', '')
abort
end
if action == 'drop'
drop_database
elsif action == 'create'
create_database
elsif action == 'migrate'
migrate_database
elsif action == 'rollback'
rollback_database
elsif action == 'recreate'
drop_database
create_database
migrate_database
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment