如何从特定数据库中获取特定表的所有表名和行计数?
结果
Table Name , Row Count , Table Size(MB)
---------------------------------------
table_1 , 10 , 2.45
table_2 , 20 , 4.00
答案 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