Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env ruby
- # List all foreign key constraints for *_id columns.
- # Use --only-no-constraint to list *_id has no constraint.
- gem "activerecord", ">= 4.2.1"
- gem "mysql2"
- require "optparse"
- require "active_record"
- require "mysql2"
- def stringify_keys_deeply(obj)
- case obj
- when Hash
- obj.inject({}) do |h, (k, v)|
- h[k.to_s] = stringify_keys_deeply(v)
- h
- end
- when Array
- obj.map{|e| stringify_keys_deeply(e) }
- else
- obj
- end
- end
- if ARGV.empty?
- puts <<-EOS
- Usage: #{$0} [--environment=development] path/to/database.yml
- #{$0} --username=USERNAME --password=PASSWORD ...
- EOS
- exit 1
- end
- options = {
- environment: "development",
- only_no_constraint: false,
- }
- conn_options = {
- adapter: "mysql2",
- encoding: "utf8",
- }
- OptionParser.new do |o|
- o.banner = <<-EOS
- Usage: #{$0} [--environment=development] path/to/database.yml
- #{$0} --database=DATABASE --username=USERNAME ...
- EOS
- o.on("-e", "--environment KEY_ON_DATABASE_YML") {|e| options[:environment] = e }
- o.on("--only-no-constraint"){|e| options[:only_no_constraint] = true }
- o.on("--database DATABASE"){|s| conn_options[:database] = s }
- o.on("--host HOST"){|s| conn_options[:host] = s }
- o.on("--port PORT"){|s| conn_options[:port] = s }
- o.on("--username USERNAME"){|s| conn_options[:username] = s }
- o.on("--password [PASSWORD]"){|s|
- unless s
- print "password: "
- s = gets.chomp
- end
- conn_options[:password] = s
- }
- o.on("--encoding ENCODING"){|s| conn_options[:encoding] = s }
- o.on("--socket SOCKET"){|s| conn_options[:socket] = s }
- o.parse!(ARGV)
- end
- if ARGV[0]
- require "yaml"
- require "erb"
- database_yml = YAML.load(ERB.new(File.read(ARGV[0])).result)
- database_yml = database_yml[options[:environment]]
- conn_options = database_yml.merge(conn_options)
- end
- ActiveRecord::Base.establish_connection(conn_options)
- conn = ActiveRecord::Base.connection
- foreign_key_columns = Hash.new{|h, k| h[k] = {} }
- conn.data_sources.each do |table_name|
- next if table_name == "schema_migrations"
- fks = conn.foreign_keys(table_name).map{|struct| stringify_keys_deeply(struct.to_h) }
- conn.columns(table_name).each do |column|
- column_name = column.name.to_s
- next unless column_name =~ /_id$/
- fks_for_column = fks.select{|fk| (fk["options"] || {})["column"] == column_name }
- next if options[:only_no_constraint] && fks_for_column.any?
- foreign_key_columns[table_name][column_name] = fks_for_column
- end
- end
- puts YAML.dump(foreign_key_columns)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement