Advertisement
Guest User

Untitled

a guest
Oct 27th, 2016
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.46 KB | None | 0 0
  1. #!/usr/bin/env ruby
  2. # List all foreign key constraints for *_id columns.
  3. # Use --only-no-constraint to list *_id has no constraint.
  4.  
  5. gem "activerecord", ">= 4.2.1"
  6. gem "mysql2"
  7.  
  8. require "optparse"
  9. require "active_record"
  10. require "mysql2"
  11.  
  12. def stringify_keys_deeply(obj)
  13. case obj
  14. when Hash
  15. obj.inject({}) do |h, (k, v)|
  16. h[k.to_s] = stringify_keys_deeply(v)
  17. h
  18. end
  19. when Array
  20. obj.map{|e| stringify_keys_deeply(e) }
  21. else
  22. obj
  23. end
  24. end
  25.  
  26. if ARGV.empty?
  27. puts <<-EOS
  28. Usage: #{$0} [--environment=development] path/to/database.yml
  29. #{$0} --username=USERNAME --password=PASSWORD ...
  30. EOS
  31.  
  32. exit 1
  33. end
  34.  
  35. options = {
  36. environment: "development",
  37. only_no_constraint: false,
  38. }
  39.  
  40. conn_options = {
  41. adapter: "mysql2",
  42. encoding: "utf8",
  43. }
  44.  
  45. OptionParser.new do |o|
  46. o.banner = <<-EOS
  47. Usage: #{$0} [--environment=development] path/to/database.yml
  48. #{$0} --database=DATABASE --username=USERNAME ...
  49. EOS
  50. o.on("-e", "--environment KEY_ON_DATABASE_YML") {|e| options[:environment] = e }
  51. o.on("--only-no-constraint"){|e| options[:only_no_constraint] = true }
  52. o.on("--database DATABASE"){|s| conn_options[:database] = s }
  53. o.on("--host HOST"){|s| conn_options[:host] = s }
  54. o.on("--port PORT"){|s| conn_options[:port] = s }
  55. o.on("--username USERNAME"){|s| conn_options[:username] = s }
  56. o.on("--password [PASSWORD]"){|s|
  57. unless s
  58. print "password: "
  59. s = gets.chomp
  60. end
  61. conn_options[:password] = s
  62. }
  63. o.on("--encoding ENCODING"){|s| conn_options[:encoding] = s }
  64. o.on("--socket SOCKET"){|s| conn_options[:socket] = s }
  65. o.parse!(ARGV)
  66. end
  67.  
  68. if ARGV[0]
  69. require "yaml"
  70. require "erb"
  71. database_yml = YAML.load(ERB.new(File.read(ARGV[0])).result)
  72. database_yml = database_yml[options[:environment]]
  73. conn_options = database_yml.merge(conn_options)
  74. end
  75.  
  76. ActiveRecord::Base.establish_connection(conn_options)
  77. conn = ActiveRecord::Base.connection
  78.  
  79. foreign_key_columns = Hash.new{|h, k| h[k] = {} }
  80.  
  81. conn.data_sources.each do |table_name|
  82. next if table_name == "schema_migrations"
  83. fks = conn.foreign_keys(table_name).map{|struct| stringify_keys_deeply(struct.to_h) }
  84. conn.columns(table_name).each do |column|
  85. column_name = column.name.to_s
  86. next unless column_name =~ /_id$/
  87.  
  88. fks_for_column = fks.select{|fk| (fk["options"] || {})["column"] == column_name }
  89. next if options[:only_no_constraint] && fks_for_column.any?
  90.  
  91. foreign_key_columns[table_name][column_name] = fks_for_column
  92. end
  93. end
  94.  
  95. puts YAML.dump(foreign_key_columns)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement