2015-01-28 14 views
31

Trong postgresql 9.4, JSONB mới được kết hợp.chuyển đổi postgresql JSON sang JSONB

Trên DB trực tiếp trong postgresql 9.3 Tôi có một cột JSON.

Tôi muốn di chuyển nó sang JSONB.

Giả sử tôi đã di chuyển DB đầu tiên đến 9,4 (sử dụng pg_upgrade). Tôi làm gì tiếp theo?

Trả lời

56
ALTER TABLE table_with_json 
    ALTER COLUMN my_json 
    SET DATA TYPE jsonb 
    USING my_json::jsonb; 
+0

Có bất kỳ điểm chuẩn nào về tốc độ này không? Lý tưởng nhất là làm thế nào mà quy mô với số lượng hồ sơ. – gregoltsov

+0

Đã hỏi câu hỏi này là [câu hỏi riêng] (https://stackoverflow.com/questions/34042429/roughly-how-fast-is-json-jsonb-column-conversion-in-postgres-9-4). – gregoltsov

+0

Trong bảng điều khiển Rails: 'ActiveRecord :: Base.connection.execute ('ALTER TABLE table_with_json ALTER COLUMN my_json SET DATA TYPE jsonb SỬ DỤNG my_json :: jsonb')' – Bengala

13

Trong bối cảnh Rails, đây là một ActiveRecord di cư thay thế:

def change 
    reversible do |dir| 
    dir.up { change_column :models, :attribute, 'jsonb USING CAST(attribute AS jsonb)' } 
    dir.down { change_column :models, :attribute, 'json USING CAST(attribute AS json)' } 
    end 
end 

Tôi không biết làm thế nào này so với câu trả lời chấp nhận hiệu suất-khôn ngoan, nhưng tôi thử nghiệm này trên một bảng với 120 000 bản ghi, mỗi bản ghi có bốn cột json và tôi mất khoảng một phút để di chuyển bảng đó. Tất nhiên, tôi đoán nó phụ thuộc vào mức độ phức tạp của cấu trúc json.

Ngoài ra, hãy chú ý rằng nếu hồ sơ hiện tại của bạn có giá trị mặc định của {}, bạn phải thêm vào những điều khoản trên default: {}, bởi vì nếu không bạn sẽ phải jsonb cột, nhưng giá trị mặc định sẽ vẫn là '{}'::json.

+1

Cảm ơn Alex, nó ổn với tôi! – ulmen

+0

@ulmen vui vì nó đã giúp :) –

+0

Trong sự tò mò, tại sao bạn lại sử dụng 'reversible do ... end' thay vì 'def up ... end' và' def down ... end'? – OzBarry

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