管理heroku上的db索引

时间:2011-09-05 04:30:03

标签: ruby-on-rails postgresql heroku

如何在Heroku上管理我的数据库索引?我知道关于水龙头,但这似乎是推/拉数据。

如何查看,更新,删除索引?我的dev db是sqlite3,而在Heroku上它是postgres。

2 个答案:

答案 0 :(得分:1)

您应该通过迁移来管理索引,以便它们在您的环境中保持同步。

答案 1 :(得分:1)

看起来您正在使用共享而非专用数据库,因此您必须以艰难的方式执行此操作。如果您有专门的数据库,那么您可以heroku pg:psql然后\di and assorted other psql commands来获取您想要的内容。

总是有困难的方法,涉及内部目录表。您需要几个SQL块,您可以将它们包含在ActiveRecord::Base.connection.select_rows调用中并从Rails控制台访问结果。

您可以使用以下命令获取表及其索引的列表:

select c2.relname as table, c2.oid as table_oid, c.relname as name, c.oid as index_oid
from pg_catalog.pg_class c
join pg_catalog.pg_index i on i.indexrelid = c.oid
join pg_catalog.pg_class c2 on i.indrelid = c2.oid
left join pg_catalog.pg_user u on u.usesysid = c.relowner
left join pg_catalog.pg_namespace n on n.oid = c.relnamespace
where c.relkind  = 'i'
  and n.nspname <> 'pg_catalog'
  and pg_catalog.pg_table_is_visible(c.oid)
order by c2.relname, c.relname

然后,您可以使用index_oid来获取相关索引的描述:

select c.relname, c.oid, i.indisprimary, i.indisunique, i.indisclustered, i.indisvalid, pg_catalog.pg_get_indexdef(i.indexrelid, 0, true), c.reltablespace
from pg_catalog.pg_class c
join pg_catalog.pg_index i on c.oid = i.indexrelid
where c.oid = '#{index_oid}'

或者您可以使用table_oid获取该表的索引列表:

select ci.relname, ci.oid, i.indisprimary, i.indisunique, i.indisclustered, i.indisvalid, pg_catalog.pg_get_indexdef(i.indexrelid, 0, true), ci.reltablespace
from pg_catalog.pg_index i 
join pg_catalog.pg_class ci on i.indexrelid = ci.oid
where i.indrelid = '#{table_oid}'
order by ci.relname  

您可能希望将所有这些内容包装在实用程序类中以便于访问:

class PGInfo
    def self.list_indexes
        data = ActiveRecord::Base.connection.select_rows(%Q{
            select c2.relname as table, c.relname as name, c.oid as oid
            ...
        })
        # do something pretty with the array of arrays that is in data
    end
    # etc.
end

我没有在Heroku上使用共享数据库尝试这些(对不起,我只有一个专门的数据库可供使用)。可能有更简单的方法,但这些方法应该完成工作,如果将它们包装在PGInfo类中,它们将很容易使用。

所有这些都为您提供了所需的索引信息,然后您可以使用常规迁移来添加,删除或修改索引。