使用Rails获取特定表的所有表名和行数?

时间:2011-04-01 04:22:09

标签: mysql ruby-on-rails ruby

如何从特定数据库中获取特定表的所有表名和行计数?

结果

Table Name , Row Count , Table Size(MB)
---------------------------------------

table_1    , 10        , 2.45

table_2    , 20        , 4.00

4 个答案:

答案 0 :(得分:2)

ActiveRecord::Base.connection.tables.each do |table|    
 h = ActiveRecord::Base.connection.execute("SHOW TABLE STATUS LIKE '#{table}'").fetch_hash
 puts "#{h['Name']} has #{h['Rows']} rows with size: #{h['Data_length']}"
end

答案 1 :(得分:1)

问题是标记为mysql,但您可以通过ORM以数据库无关的方式进行。

override fun onResume() {
    super.onResume()
    doAsync {
        Log.d("foo", "async")
    }
}

请注意,这将跳过您没有对象映射的表,例如class DatabaseReport def entry_counts table_model_names.map do |model_name| entity = model_name.constantize rescue nil next if entity.nil? { entity.to_s => entity.all.count } end.compact end private def table_model_names ActiveRecord::Base.connection.tables.map(&:singularize).map(&:camelize) end end ar_internal_metadata等元表。它也无法推断范围模型(但可以扩展为这样做)。例如。与schema_migrations我这样做:

Delayed::Job

答案 2 :(得分:1)

我想出了我自己的版本,它也与数据库无关。

因为它直接使用后代,所以它还处理 table_name 与模型名称不同的任何表。

救援 nil 存在于当您拥有从 ActiveRecord 继承的类但由于某种原因没有与之关联的表的情况。它确实为 STI 类和父类提供数据。

my_models = ActiveRecord::Base.descendants

results = my_models.inject({}) do |result, model|
  result[model.name] = model.count rescue nil
  result
end

答案 3 :(得分:0)

    @temp_table = []
    ActiveRecord::Base.connection.tables.each do |table|
      count = ActiveRecord::Base.connection.execute("SELECT COUNT(*) as count FROM #{table}").fetch_hash['count']
      size = ActiveRecord::Base.connection.execute("SHOW TABLE STATUS LIKE '#{table}'").fetch_hash
      @temp_table <<  {:table_name => table,
          :records => count.to_i,
          :size_of_table => ((BigDecimal(size['Data_length']) + BigDecimal(size['Index_length']))/1024/1024).round(2)
        }
      end
    end