Skip to content

Instantly share code, notes, and snippets.

@nroose
Last active June 18, 2021 23:10
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 nroose/9f02bd2de56656bbf41acffcac786019 to your computer and use it in GitHub Desktop.
Save nroose/9f02bd2de56656bbf41acffcac786019 to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby
env_rb = ['../config/environment.rb', 'config/environment.rb'].detect { |file| File.exist? file }
raise 'Run this from rails root or a subdirectory.' unless env_rb
require File.expand_path(env_rb)
if ARGV[0] =~ /^-[cexq]$/
ARGV.shift
sql_in = ARGV.join(' ')
elsif ARGV[0] =~ /^-f?/
ARGV.shift
sql_in = ARGF.read
elsif ARGV[0] == '-h'
puts "#{$PROGRAM_NAME} [<sql file>]"
puts "#{$PROGRAM_NAME} -q <query>"
puts "#{$PROGRAM_NAME} -f <file>"
puts "#{$PROGRAM_NAME} -"
puts "#{$PROGRAM_NAME}"
exit
end
loop do
print 'sql> ' unless sql_in
sql = sql_in || gets.strip rescue (puts; exit)
break if sql == 'q'
sql.split(';').each do |query|
next if query.blank?
puts
puts query
results = ActiveRecord::Base.connection.select_all(query).to_a
next if results.blank?
columns = {}
results.first.each_key do |k|
columns[k] = [results.map { |g| g[k].size }.max, k.titleize.size].max
end
puts "+-#{columns.map { |_k, v| '-' * v }.join('-+-')}-+"
puts "| #{columns.map { |k, v| k.ljust(v) }.join(' | ')} |"
puts "+-#{columns.map { |_k, v| '-' * v }.join('-+-')}-+"
results.each do |row|
puts "| #{columns.keys.map { |k| row[k].to_s.ljust(columns[k]) }.join(' | ')} |"
end
puts "+-#{columns.map { |_k, v| '-' * v }.join('-+-')}-+"
puts
rescue => e
puts e
end
break if sql_in.present?
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment