2012-09-26 13 views
20

मैं निम्न माइग्रेशन प्रदर्शन करने के लिए प्रदर्शन कर रहा पर "ट्वीट" मॉडल की मेजरेल प्रवासन समय त्रुटि Heroku

class ChangeDataTypeForTweetsNumber < ActiveRecord::Migration 
    def up 
    change_column :tweets do |t| 
     t.change :number, :integer 
    end 
    end 

    def down 
    change_table :tweets do |t| 
     t.change :number, :string 
    end 
    end 
end 

में स्तंभ "संख्या" बदलने के लिए कोशिश कर रहा हूँ करने के लिए जोर दे रहा डब्ल्यू/Postgres निम्नलिखित Heroku के लिए प्रवास ....

heroku rake db:migrate:up VERSION=20120925211232 

मैं निम्नलिखित त्रुटि मिलती है

PG::Error: ERROR: column "number" cannot be cast to type integer 
: ALTER TABLE "tweets" ALTER COLUMN "number" TYPE integer 

कोई विचार आपके पास बहुत सराहना की जाएगी।

सभी को धन्यवाद।

उत्तर

31

fine manual से:

[परिवर्तन तालिका ... स्तंभ को बदलने ...]
वैकल्पिक USING खंड निर्दिष्ट करता है पुराने से नया स्तंभ मूल्य की गणना करने के लिए कैसे; यदि छोड़ा गया है, तो डिफ़ॉल्ट रूपांतरण पुराने डेटा प्रकार से नए में असाइनमेंट कास्ट जैसा ही होता है। USING क्लॉज प्रदान किया जाना चाहिए यदि पुरानी से नए प्रकार में कोई अंतर्निहित या असाइनमेंट नहीं है।

कोई अंतर्निहित PostgreSQL में int को varchar से रूपांतरण तो यह है कि column "number" cannot be cast to type integer शिकायत करता है और ALTER तालिका विफल हो जाए। आपको PostgreSQL को नए कॉलम प्रकार से मेल खाने के लिए पुरानी तारों को संख्याओं में परिवर्तित करने की आवश्यकता है और इसका मतलब है कि आपको अपने वैकल्पिक तालिका में उपयोग करने की आवश्यकता है। मैं रेल है कि आप, लेकिन आप हाथ आसानी से पर्याप्त से यह कर सकते हैं के लिए बनाने के लिए किसी भी तरह से के बारे में पता नहीं है:

def up 
    connection.execute(%q{ 
    alter table tweets 
    alter column number 
    type integer using cast(number as integer) 
    }) 
end 

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

आपका मौजूदा डाउन-माइग्रेशन ठीक होना चाहिए, integer से varchar को स्वचालित रूप से संभाला जाना चाहिए।

+0

बहुत ही दिलचस्प - धन्यवाद! – dougiebuckets

+0

इसे करने के लिए एक संक्षिप्त और बेवकूफ तरीका के लिए, नीचे रिले का जवाब देखें! – danmaz74

+0

@ danmaz74: क्या आप जानते हैं कि 2012 में यह उपलब्ध था या क्या मुझे कुछ याद आया? –

46
ऊपर, लेकिन थोड़ा और अधिक संक्षिप्त रूप

ही:

change_column :yourtable, :column_to_change, 'integer USING CAST("column_to_change" AS integer)' 
+0

एआर की तरह लगता है कि इसे वास्तव में – Rob

+1

को संभालना चाहिए उस मामले में एक परिवर्तनीय माइग्रेशन के लिए इसका उपयोग करें: 'रिवर्सिबल डू | डीआईआर | dir.up do change_column: yourtable,: column_to_change, 'पूर्णांक का उपयोग करने वाला पूर्णांक ("स्तंभ_to_change" एएस पूर्णांक)' अंत डीआईआर।डाउन करें change_column: yourtable,: column_to_change, 'कैस्ट का उपयोग करने वाले चरित्र ("column_to_change" एएस चरित्र भिन्न)' अंत एंड' – febeling

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