ROR माइग्रेशन के दौरान Date से DateTime तक कॉलम प्रकार बदलें


227

मुझे अपना कॉलम प्रकार तिथि से डेटटाइम तक बदलने की आवश्यकता है जो मैं बना रहा हूं। मैं डेटा के बारे में परवाह नहीं करता हूं क्योंकि यह अभी भी विकसित हो रहा है।

मैं यह कैसे कर सकता हूँ?

जवाबों:


508

पहले अपने टर्मिनल में:

rails g migration change_date_format_in_my_table

फिर अपनी माइग्रेशन फ़ाइल में:

रेल के लिए> = 3.2:

class ChangeDateFormatInMyTable < ActiveRecord::Migration
  def up
    change_column :my_table, :my_column, :datetime
  end

  def down
    change_column :my_table, :my_column, :date
  end
end

27
आप सही हैं, मैंने अभी एक शुरुआत की है जो उपलब्ध नवीनतम तकनीक का चयन करेगी, लेकिन यह निश्चित रूप से अनिश्चित है
क्षमा करना

12
प्रश्न को "रूबी-ऑन-रेल्स -3" टैग किया गया है
Sucrenoir

2
@Sucrenoir हाँ टैग को उत्तर देने के बाद एपनेडिंग द्वारा जोड़ा गया था।
जेसन

10
यदि आप सोच रहे हैं कि विधियों और विधियों के changeबजाय एकल विधि का उपयोग क्यों नहीं किया जाता है , तो यह इसलिए है क्योंकि यह विधि माइग्रेशन परिभाषा का समर्थन नहीं करती हैupdownchangechange_column
डेनिस

2
यह उत्तर केवल आंशिक रूप से सही है, आप परिवर्तन का उपयोग नहीं कर सकते हैं_बदलें 4 या नीचे प्रवास पर भी परिवर्तन काम नहीं करेगा। आपको रेल के संस्करण के ऊपर / नीचे का उपयोग करना चाहिए।
एलन पीबॉडी

78

इसके अलावा, यदि आप रेल 3 या नए का उपयोग कर रहे हैं, तो आपको upऔर downविधियों का उपयोग करने की आवश्यकता नहीं है । आप बस उपयोग कर सकते हैं change:

class ChangeFormatInMyTable < ActiveRecord::Migration
  def change
    change_column :my_table, :my_column, :my_new_type
  end
end

78
परिवर्तन विधि केवल प्रतिवर्ती पलायन के साथ काम करती है। ऊपर दिया गया कोड एक ActiveRecord :: अपरिवर्तनीय माइग्रेशन अपवाद को फेंक देगा। केवल परिवर्तन विधि में api.rubyonrails.org/classes/ActiveRecord/Migration/… का उपयोग किया जाना चाहिए।
davekaro

3
मैं रेल्स 4 चला रहा हूं और इस तरह का माइग्रेशन पहले भी कर चुका हूं। परिवर्तन काम नहीं करता है! @ davekaro की टिप्पणी सही है।
harryt

3
रेल 5 के लिए, यह सही और कार्यशील समाधान है।
WM

3
जब उलटा किया जा रहा है, तो यह कैसे पता चलेगा कि पुराने स्तंभ का प्रकार क्या है जो इसे वापस बदलना चाहिए?
एंड्रयू ग्रिम

@AndrewGrimm आप सही हैं। जब मैं अपने माइग्रेशन को उलटने की कोशिश करता हूं तो यह वही होता है:This migration uses change_column, which is not automatically reversible. To make the migration reversible you can either: 1. Define #up and #down methods in place of the #change method. 2. Use the #reversible method to define reversible behavior.
मार्कलर

42

रेल 3.2 और रेल 4 में, बेंजामिन के लोकप्रिय जवाब में थोड़ा अलग वाक्यविन्यास है।

पहले अपने टर्मिनल में:

$ rails g migration change_date_format_in_my_table

फिर अपनी माइग्रेशन फ़ाइल में:

class ChangeDateFormatInMyTable < ActiveRecord::Migration
  def up
   change_column :my_table, :my_column, :datetime
  end

  def down
   change_column :my_table, :my_column, :date
  end
end

23

वहाँ एक है change_column विधि, बस एक नए प्रकार के रूप में अपने प्रवास में निष्पादित datetime साथ।

change_column(:my_table, :my_column, :my_new_type)

1
क्या यह मूल डेटा को संरक्षित करता है?
BKSpurgeon

1
हां, मूल डेटा को संरक्षित करें
Mauro

1

AFAIK, माइग्रेशन वहाँ हैं जब आप स्कीमा परिवर्तन करते हैं (यानी उत्पादन) की देखभाल करने वाले डेटा को फिर से देखने का प्रयास करते हैं। इसलिए जब तक यह गलत न हो, और जब से उन्होंने कहा कि उन्हें डेटा की परवाह नहीं है, तो क्यों न केवल मूल माइग्रेशन में डेट टाइप से डेटाइम को संशोधित किया जाए और माइग्रेशन को फिर से चलाया जाए? (आशा है कि आपको परीक्षण मिल गए हैं :))।


2
यदि आप डेटा की परवाह नहीं करते हैं, तो यदि आप एक टीम में काम कर रहे हैं और आप अपने स्कीमा को अपनी टीम में अन्य सभी डेवलपर्स के लिए प्रचारित करना चाहते हैं, तो आप संभावित रूप से विकास के माहौल में प्रवास का उपयोग करने के बारे में परवाह कर सकते हैं।
जोस बी

मुझे यह देखने में परेशानी हो रही है कि किसी कॉलम को बदलने के लिए अतिरिक्त माइग्रेशन का क्या फायदा आपको इस स्थिति में देता है। कॉलम बनाने वाले मूल माइग्रेशन को बदलने में क्या गलत है? या तो मामले में, प्रत्येक टीम के सदस्य को नया स्कीमा प्राप्त करने के लिए सभी माइग्रेशन को फिर से चलाना होगा।
फर्जीवाड़ा

यदि आप एक नए माइग्रेशन का उपयोग करते हैं, तो आप उस माइग्रेशन को पूर्ववत कर सकते हैं जिसने कॉलम प्रकार को बदल दिया है। यदि आप मूल को संपादित करते हैं, तो आपको उस रोलबैक को रोलबैक करना होगा और उसके बाद माइग्रेशन को फिर से चलाएँ।
जाजपपी

यह वास्तव में एक बहुत ही विवेकपूर्ण जवाब है, यह देखते हुए कि अभी तक कोई उत्पादन डेटा नहीं है। टीम के अन्य सदस्यों के बारे में चिंता करने वालों के लिए, यही rake db:migrate:resetहै।
रायन मैक्ग्रेई
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.