require “fileutils” require “dotenv” require “sequel”
namespace :db do
task :environment do ENV["APP_ENV"] ||= "development" require "bundler" Bundler.require :default, ENV["APP_ENV"].to_sym Dotenv.load if %w[development test].include? ENV["APP_ENV"] end task connect_db: :environment do DB = Sequel.connect(ENV["APP_ENV"] == "test" ? ENV["TEST_DATABASE_URL"] : ENV["DATABASE_URL"]) DB.extension :pg_array, :pg_json Sequel.extension :migration end desc "Create databases" task create: :environment do %w[DATABASE_URL TEST_DATABASE_URL].each do |db_url| db_url = ENV[db_url] puts "CREATE: #{db_url}" if db_url.nil? puts "#{db_url} not set!" next end dbname = URI.parse(db_url).path[1..-1] system("createdb #{dbname}") end end desc "Run migrations" task :migrate, [:version] => :connect_db do |t, args| db_dir = File.join(t.application.original_dir, "db") migrations_dir = File.join(db_dir, "migrations") if args[:version] Sequel::Migrator.run(DB, migrations_dir, target: args[:version].to_i) else Sequel::Migrator.run(DB, migrations_dir) end if ENV["APP_ENV"] == "development" system("sequel -d #{ENV['DATABASE_URL']} > #{db_dir}/schema.rb") end Rake::Task["db:version"].execute end desc "Rollback to migration" task rollback: :connect_db do |t| version = if DB.tables.include?(:schema_migrations) previous = DB[:schema_migrations].order(Sequel.desc(:filename)).limit(2).all[1] previous ? previous[:filename].split("_").first : nil end || 0 db_dir = File.join(t.application.original_dir, "db") migrations_dir = File.join(db_dir, "migrations") Sequel::Migrator.run(DB, migrations_dir, target: version.to_i) if ENV["APP_ENV"] == "development" system("sequel -d #{ENV['DATABASE_URL']} > #{db_dir}/schema.rb") end Rake::Task["db:version"].execute end desc "Create a migration" task :create_migration, [:name] => :connect_db do |t, args| require "date" raise("Name required") unless args[:name] timestamp = DateTime.now.strftime("%Y%m%d%H%M%S") migrations_dir = File.join(t.application.original_dir, "db", "migrations") FileUtils.mkdir_p(migrations_dir) path = "#{migrations_dir}/#{timestamp}_#{args[:name]}.rb" File.open("#{@root_dir}/#{path}", "w") do |f| f.write("Sequel.migration do\n up do\n end\n\n down do\n end\nend") end puts "MIGRATION CREATED: #{path}" end desc "Prints current schema version" task version: :connect_db do version = if DB.tables.include?(:schema_migrations) latest = DB[:schema_migrations].order(:filename).last latest ? latest[:filename] : nil end || 0 puts "Schema Version: #{version}" end
end