Управление дб индексами по героку - PullRequest
6 голосов
/ 05 сентября 2011

Как мне управлять индексами моей базы данных в Heroku? Я знаю о кранах, но, похоже, это для подталкивания / извлечения данных.

Как мне просмотреть, обновить, удалить мои индексы? Моя база данных - это sqlite3, а на Heroku - postgres.

Ответы [ 2 ]

1 голос
/ 06 сентября 2011

Похоже, что вы используете общую, а не выделенную базу данных, поэтому вам придется делать это нелегко. Если у вас была выделенная база данных, вы могли бы heroku pg:psql, а затем \di и другие psql команды , чтобы получить то, что вы ищете.

Хотя всегда есть трудный путь, который включает внутренние таблицы каталогов. Вам понадобится несколько кусков 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.

Все, что дает вам необходимую информацию об индексе, затем вы можете использовать обычные миграции для добавления, удаления или изменения ваших индексов.

1 голос
/ 05 сентября 2011

Вы должны управлять своими индексами с помощью миграций, чтобы они синхронизировались между вашими средами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...