Last active
May 10, 2020 04:17
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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