を取得する方法が知りたいのだけれど、heroku info
コマンドでは欲しい値が得られない。heroku が提供するデータベースの無料領域は <del> 5MB というあまりにも貧弱な容量なので、このままでは安心して遊べない。</del> 現在の PostgreSQL : Dev Plan では "10,000 row limit" とのこと。
そこで見つけたエントリ herokuでのWebアプリ開発と運用(その4:データサイズ肥大化の対処)
heroku run console
後に下記を実行して ( 実際には一行 )
ActiveRecord::Base.connection.select_all(
"SELECT relname, relkind, to_char(reltuples, '999,999,999') as rows,
to_char(pg_relation_size(relname), '999,999,999,999')
as bytes FROM pg_class
WHERE relnamespace = (SELECT oid FROM pg_namespace WHERE nspname='public');"
).each{|i|
puts "#{i['relname'].ljust(30)}#{i['bytes'].rjust(15)}bytes#{i['rows'].rjust(10)}rows"
}
試してみるものの
PG::Error: ERROR: function pg_relation_size(name) does not exist
LINE 1: ...o_char(reltuples, '999,999,999') as rows, to_char(pg_relatio... ^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
叱られる。
どうやら PostgreSQL ではバージョンによってキャストまわりの仕様が異なるらしい。
8.3 以降では明示的なキャストが必要 とのこと。
ということで先ほどの relname
という引数は relname::text
に変えてやれば大丈夫。
ActiveRecord::Base.connection.select_all(
"SELECT relname, relkind, to_char(reltuples, '999,999,999') as rows,
to_char(pg_relation_size(relname::text), '999,999,999,999')
as bytes FROM pg_class
WHERE relnamespace = (SELECT oid FROM pg_namespace WHERE nspname='public');"
).each{|i|
puts "#{i['relname'].ljust(30)}#{i['bytes'].rjust(15)}bytes#{i['rows'].rjust(10)}rows"
}
これで無事に必要な値が得られた。
schema_migrations 8,192bytes 0rows
unique_schema_migrations 16,384bytes 0rows
hoges_id_seq 8,192bytes 1rows
hoges 8,192bytes 2rows
hoges_pkey 16,384bytes 2rows
めでたし。