मैं इस तरह से माइग्रेशन लिखूंगा:
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
. के रूप में रहेगा ।