2012-01-05 20 views
7

के लिए रेल पर रूबी के लिए MySQL से PostgreSQL में स्विचिंग मैं रेलू ऐप पर हेरोोकू पर एक नया नया रूबी धक्का देने की कोशिश कर रहा हूं। वर्तमान में, यह MySQL पर बैठता है। ऐसा लगता है कि हेरोोकू वास्तव में MySQL का समर्थन नहीं करता है और इसलिए हम PostgreSQL का उपयोग करने पर विचार कर रहे हैं, जिसे वे समर्थन देते हैं।हेरोकू

मुझे यह कितना मुश्किल होना चाहिए? ऐसा करने के लिए मुझे क्या करने की ज़रूरत है?

फिर से, कृपया ध्यान दें कि मेरे डीबी अभी के रूप में (दोनों विकास & उत्पादन) पूरी तरह खाली हैं।

उत्तर

4

आप Postgres करने के लिए स्थानांतरित करने के लिए है मत मानो - कई MySQL Addon प्रदाताओं Heroku पर उपलब्ध देखते हैं - http://addons.heroku.com/cleardb एक मैं के साथ सबसे अधिक सफलता मिली है।

+0

ठंडा मुझे आगे बढ़ना पड़ सकता है और इसे आज़माएं, जानकारी के लिए धन्यवाद! –

+0

यह ध्यान दिया जाना चाहिए कि MySQL एडन की सीमाएं हैं जो गंभीर अनुप्रयोगों के लिए व्यावहारिक नहीं बनाती हैं। – Dan

0

यह सादगी होना चाहिए: डीडीएल को MySQL से PostgreSQL तक पोर्ट करें।

क्या हेरोकू में कोई स्कीमा निर्माण स्क्रिप्ट है? अगर वे उपलब्ध थे तो मैं उन पर निर्भर करता हूं।

MySQL और PostgreSQL अलग हैं (उदा। MySQL के लिए पहचान प्रकार, PostgreSQL के लिए अनुक्रम)। लेकिन बंदरगाह बहुत कठिन नहीं होना चाहिए। कितने टेबल? दस काम करने योग्य हैं।

4

आप स्थानांतरित करना कोई डेटा नहीं है, तो यह आपके Gemfile कह बजाय pg मणि उपयोग करने के लिए, bundle install चल रहा है, और अपने PostgreSQL डेटाबेस भेजने के लिए अपना database.yml फ़ाइल को अद्यतन करने के रूप में सरल होना चाहिए। फिर बस अपने माइग्रेशन चलाएं (rake db:migrate) और सबकुछ बढ़िया काम करना चाहिए।

9

सामान्य समस्याएं:

  1. ग्रुप व्यवहार से। PostgreSQL के बजाय एक सख्त समूह है। यदि आप ग्रुप बाय क्लॉज का उपयोग करते हैं, तो आपके SELECT में प्रत्येक कॉलम या तो आपके ग्रुप बाय में दिखाई देगा या एक समग्र फ़ंक्शन में उपयोग किया जाना चाहिए।
  2. डेटा कटाव। MySQL एक char(n) कॉलम के अंदर फिट होने के लिए चुपचाप एक लंबी स्ट्रिंग को छोटा कर देगा जब तक कि आपका सर्वर सख्त मोड में न हो, PostgreSQL शिकायत करेगा और आपको अपनी स्ट्रिंग को स्वयं को छोटा कर देगा।
  3. उद्धरण अलग है, MySQL पहचानकर्ता उद्धृत करने के लिए बैकटिक्स का उपयोग करता है जबकि PostgreSQL डबल कोट्स का उपयोग करता है।
  4. LIKE MySQL में असंवेदनशील है लेकिन PostgreSQL में नहीं है। यह कई MySQL उपयोगकर्ताओं को LIKE को केस असंवेदनशील स्ट्रिंग समानता ऑपरेटर के रूप में उपयोग करने के लिए प्रेरित करता है।

(1) यदि आप किसी भी कच्चे एसक्यूएल में अपने किसी भी प्रश्न या ग्रुप बाय में एआर की group विधि का उपयोग करते हैं तो यह एक मुद्दा होगा। कुछ column "X" must appear in the GROUP BY clause or be used in an aggregate function के लिए खोज करें और आपको कुछ उदाहरण और सामान्य समाधान दिखाई देंगे।

(2) एक समस्या होगी यदि आप अपने आवेदन में कहीं भी स्ट्रिंग कॉलम का उपयोग करते हैं और आपके मॉडल की सभी आने वाली स्ट्रिंग मानों की उचित रूप से मान्य नहीं हैं। ध्यान दें कि सीमा निर्दिष्ट किए बिना रेल में स्ट्रिंग कॉलम बनाना वास्तव में varchar(255) कॉलम बनाता है, इसलिए वास्तव में एक अंतर्निहित :limit => 255 है, भले ही आपने एक निर्दिष्ट नहीं किया हो। t.string की बजाय अपने तारों के लिए t.text का उपयोग करना एक विकल्प है; यह आपको दंड के बिना मनमाने ढंग से बड़े तारों के साथ काम करने देगा (कम से कम PostgreSQL के लिए)। जैसा कि इरविन नीचे नोट करता है (और वह हर दूसरे मौके को प्राप्त करता है), varchar(n) PostgreSQL दुनिया में एक अनाचारवाद है।

(3) तब तक कोई समस्या नहीं होनी चाहिए जब तक कि आपके कोड में कच्चा SQL न हो।

(4) यदि आप अपने आवेदन में कहीं भी LIKE का उपयोग कर रहे हैं तो एक समस्या होगी।(यदि आप चिल्लाओ करने के लिए पसंद करते हैं या upper(a) like upper(b)) आप lower(a) like lower(b) को a like b बदलकर यह एक ठीक कर सकते हैं या a ilike b लेकिन ध्यान रखें कि PostgreSQL's ILIKE अमानक है।

अन्य मतभेद है कि मुसीबत पैदा कर सकता है, लेकिन उन सबसे सामान्य समस्याओं की तरह लग रहे हैं।

आप कुछ बातें की समीक्षा करने के सुरक्षित महसूस करना होगा:

  • group कॉल।
  • कच्चे एसक्यूएल (where कॉल में किसी भी के टुकड़े भी शामिल है)।
  • आपके मॉडल में स्ट्रिंग लंबाई सत्यापन।
  • LIKE के सभी उपयोग।
+1

विज्ञापन 1. ग्रुप द्वारा: इस संस्करण 8.3 (Heroku) के लिए सच है, लेकिन संस्करण 9.1 में बदल गया है। [रिलीज नोट्स हमें बताएं] (http://www.postgresql.org/docs/9.1/interactive/release-9-1.html): प्राथमिक कुंजी निर्दिष्ट होने पर क्वेरी लक्ष्य सूची में कॉलम द्वारा गैर-समूह को अनुमति दें खंड (पीटर Eisentraut) द्वारा समूह में ' –

+1

विज्ञापन 2. आप PostgreSQL में बेहतर स्ट्रिंग डेटा प्रकार' text' (या 'लंबाई विनिर्देशक बिना varchar') का उपयोग करके सभी मुसीबतों से बच सकते हैं। ** यदि ** आपके पास 'वर्कर (एन)' कॉलम हैं, तो आप स्पष्ट रूप से कास्टिंग करके त्रुटियों से बच सकते हैं: '' foobarbaz ':: varchar (3) '। मैं बोली [मैनुअल] (http://www.postgresql.org/docs/9.1/interactive/datatype-character.html): 'अति-लंबाई एक error.' –

+0

@Erwin को ऊपर उठाने के बिना एन वर्णों तक छोटा कर दिया जाएगा: हेरोोकू साझा करने के लिए 8.3 का उपयोग करता है, 9.0 समर्पित के लिए, इसलिए ग्रुप बाय इश्यू तब भी लागू होता है जब तक कि हेरोकू अपग्रेड करने के लिए न हो जाए (मैं पीटर के समूह को बदलने के लिए 9.1 अपग्रेड की उम्मीद कर रहा हूं)। और जब तक आप अपने कॉलम के लिए 'स्ट्रिंग' के बजाय 'text' का उपयोग नहीं करते हैं, तब तक आप रेल का उपयोग करते समय वर्कर मुद्दों से फंस जाते हैं (वे रेल प्रकार हैं, पोस्टग्रेएसक्यूएल वाले नहीं हैं), आप भी इसमें शामिल नहीं हो पाएंगे एसक्यूएल जब तक कि आप इसे हाथ से नहीं लिखते हैं और यह रेल कोड में होने वाला नहीं है। –