2011-09-05 36 views
6

Làm cách nào để quản lý các chỉ mục cơ sở dữ liệu của tôi trên Heroku? Tôi biết về vòi nhưng điều đó dường như là để đẩy/kéo dữ liệu.Quản lý chỉ mục db trên heroku

Làm cách nào để xem, cập nhật, xóa chỉ mục của tôi? Db dev của tôi là sqlite3 trong khi trên Heroku đó là postgres.

+0

Đó là $ 15/tháng postgres, 20 hợp đồng biểu diễn. Tôi không chắc chắn nếu nó được chia sẻ hoặc dành riêng. – Brand

Trả lời

1

Có vẻ như bạn đang sử dụng cơ sở dữ liệu được chia sẻ chứ không phải dành riêng để bạn phải làm điều đó một cách khó khăn. Nếu bạn có một cơ sở dữ liệu chuyên dụng thì bạn có thể heroku pg:psql và sau đó \di and assorted other psql commands để có được những gì bạn đang tìm kiếm.

Luôn có một cách khó khăn và liên quan đến các bảng danh mục nội bộ. Có vài khối SQL bạn cần, bạn có thể bọc chúng trong các cuộc gọi ActiveRecord::Base.connection.select_rows và truy cập kết quả từ bảng điều khiển Rails của mình.

Bạn có thể nhận được một danh sách các bảng của bạn và lập chỉ mục của họ với điều này:

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 

Sau đó, bạn có thể sử dụng index_oid để có được một mô tả về các chỉ số trong câu hỏi với điều này:

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}' 

Hoặc bạn có thể sử dụng table_oid để nhận danh sách các chỉ mục cho bảng đó với điều này:

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 

Bạn có thể muốn quấn tất cả các công cụ này trong một lớp tiện ích để dễ dàng truy cập:

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 

tôi đã không cố gắng này với một cơ sở dữ liệu được chia sẻ tại Heroku (xin lỗi, tôi chỉ có một cơ sở dữ liệu chuyên dụng để chơi với). Có thể có những cách dễ dàng hơn nhưng những việc này sẽ hoàn thành công việc và chúng sẽ dễ sử dụng nếu bạn gói chúng trong lớp PGInfo.

Tất cả cung cấp cho bạn thông tin chỉ mục bạn cần, sau đó bạn có thể sử dụng di chuyển bình thường để thêm, xóa hoặc sửa đổi chỉ mục của mình.

+0

cảm ơn bạn vì câu trả lời rất kỹ lưỡng – Brand

+0

@ Thương hiệu: Bạn được chào đón, tôi thực sự sử dụng câu trả lời để giữ ghi chú cho bản thân mình đôi khi :) –

1

Bạn nên quản lý các chỉ mục của mình thông qua di chuyển để chúng được đồng bộ hóa giữa các môi trường của bạn.

+0

điều này không cho phép tôi xem chỉ mục của tôi tho hiện nó? hoặc bạn đang nói về việc xem xét schema.rb? – Brand

+0

Vâng, bạn có thể grep add_index trong tất cả các di chuyển của bạn nếu bạn muốn, nhưng schema.rb là nơi để xem. Tôi không biết cách nào tốt hơn, và tôi nghĩ làm bất cứ điều gì đặc biệt của heroku sẽ đi xuống con đường cho phép bạn thay đổi lược đồ cơ sở dữ liệu sản xuất theo cách sẽ xấu đi xuống đường. – spike

Các vấn đề liên quan