2015-01-28 12 views
31

पोस्टग्रेस्क्ल 9.4 में नया JSONB शामिल किया गया था।पोस्टग्रेस्क्ल JSON से JSONB

पोस्टग्रेस्क्ल 9.3 में लाइव डीबी पर मेरे पास एक JSON कॉलम है।

मैं इसे जेएसओएनबी में माइग्रेट करना चाहता हूं।

मान लीजिए कि मैंने पहले डीबी को 9.4 (पीजी_अपग्रेड का उपयोग करके) माइग्रेट किया था। अब मुझे आगे क्या करना है?

उत्तर

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

क्या इस बात पर कोई बेंचमार्क है कि यह कितना तेज़ है? आदर्श रूप से रिकॉर्ड की संख्या के साथ यह कैसे स्केल करता है। – gregoltsov

+0

इसे [एक अलग प्रश्न] के रूप में पूछा गया (https://stackoverflow.com/questions/34042429/roughly-how-fast-is-json-jsonb-column-conversion-in-postgres-9-4)। – gregoltsov

+0

में रेल कंसोल: 'ActiveRecord :: Base.connection.execute ('परिवर्तन तालिका table_with_json स्तंभ को बदलने my_json सेट डेटा प्रकार jsonb का उपयोग my_json :: jsonb')' – Bengala

13

रेल के संदर्भ में, यहाँ एक ActiveRecord प्रवास विकल्प है:

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 

मैं नहीं जानता कि यह कैसे स्वीकार कर लिया जवाब प्रदर्शन के लिहाज से की तुलना, लेकिन मैं एक मेज पर इस परीक्षण किया 120 000 रिकॉर्ड के साथ, प्रत्येक रिकॉर्ड में चार json कॉलम हैं और मुझे उस तालिका को माइग्रेट करने में लगभग एक मिनट लग गए। बेशक, मुझे लगता है कि यह इस बात पर निर्भर करता है कि json संरचना कितनी जटिल है।

इसके अलावा, नोटिस यदि आपके मौजूदा रिकॉर्ड {} का डिफ़ॉल्ट मान है, तो आप ऊपर बयान default: {} में जोड़ने के लिए, क्योंकि अन्यथा आप jsonb कॉलम होगा है, लेकिन डिफ़ॉल्ट मान '{}'::json के रूप में रहेगा।

+1

धन्यवाद एलेक्स में पलायन काम नहीं करता है, ये मेरे लिए सही है! – ulmen

+0

@ulmen खुश है कि यह मदद की :) –

+0

उत्सुकता से, आप 'def up ... end' और' def down ... end' के बजाय 'रिवर्सिबल डू ... एंड' का उपयोग क्यों करेंगे? – OzBarry

संबंधित मुद्दे