2009-10-21 19 views
11

क्या मै मैरीरी के साथ एमएसबीएल को डीबी इंजन के रूप में उपयोग करने के लिए रेल सेट कर सकता हूं? मैंने कभी भी mysql को पुनरारंभ नहीं किया है, और डीबी का पुनर्निर्माण अक्सर इतना करता हूं कि मैं इसे तेज़ कर दूंगा। परीक्षण चलाने के लिए मेमोरी डीबी होने से भी अच्छा होगा।मेमोरी डेटाबेस में रेल

संपादित करें: मुझे यह निर्दिष्ट करना चाहिए कि यह केवल dev/test के लिए है, उत्पादन नहीं।

उत्तर

6

मुझे नहीं लगता कि आप क्यों नहीं कर सके; स्टोरेज इंजन की आपकी पसंद एक MySQL कार्यान्वयन विस्तार है। आपको बस अपने create_table में अपने माइग्रेशन में घोषणा :options => "ENGINE=MEMORY" सेट करने की आवश्यकता है।

बेशक, मैं यह भी नहीं देखता कि आप क्यों करेंगे - खासकर उत्पादन में। मेमरी इंजन के लिए MySQL प्रलेखन full of caveats है, जैसे कि निश्चित लंबाई क्षेत्र आवंटन, और जो गति लाभ आपको पता चलेगा वह सब कुछ खोने के जोखिम की तुलना में तुच्छ होना चाहिए। यदि आपका आवेदन ऐसा है कि कुछ भी जारी रखने की आवश्यकता नहीं है, तो क्यों, केवल ActiveRecord को पूरी तरह से छोड़ें और मेमकैच के शीर्ष पर अपने मॉडल को क्यों न रखें?

+0

मुझे मूल रूप से कहा जाना चाहिए था, लेकिन यह उत्पादन के लिए नहीं है, बस मुझे विकासशील है। माइग्रेशन में इंजन डालना तब एक विकल्प नहीं है (जब तक कि मैं सशर्त रूप से पर्यावरण पर आधारित न हो) –

+0

तो यह सशर्त रूप से पर्यावरण पर आधारित है। यह एक विकल्प क्यों नहीं है? ': विकल्प => (RAILS_ENV! = 'उत्पादन'?" इंजन = स्मृति ": शून्य) '(बस सुनिश्चित करें कि आपका परीक्षण कुछ अजीबता से नहीं फेंक दिया गया है जो केवल स्मृति इंजन में मौजूद है।व्यक्तिगत रूप से, मैं अभी भी इससे परेशान नहीं होगा; लेकिन यदि आप वास्तव में सोचते हैं कि डेटाबेस की गति आपकी परीक्षण बाधा है, तो अपने आप को दस्तक दें।) – SFEley

+1

क्योंकि मैं वहां उस बकवास के साथ एसएमएम में माइग्रेशन नहीं करना चाहता हूं। मैं इसे अपनी खुद की छोटी दुनिया में स्थानीय रूप से करना चाहता था, और अगर उसने मेरे लिए चीजों को थोड़ा तेज़ बना दिया, तो मुझे डीबी पुनर्निर्माण या कुछ करना पड़ा, फिर जीतें, लेकिन यदि नहीं, तो कौन परवाह करता है, मैं बस इसका उपयोग करता नियमित सेटअप उत्तर और कुछ अन्य पढ़ने से, यह इसके (संभवतः यहां तक ​​कि) मूल्य से अधिक काम नहीं है। –

2

मैं परीक्षण के लिए स्मृति डेटाबेस में sqlite3 का उपयोग करता हूं। यह आमतौर पर फ़ाइल आधारित की तुलना में थोड़ा तेज़ होता है, लेकिन तब तक इतना नहीं है जब तक आपके पास टेस्ट डेटा का एक टन न हो।

कि आपके database.yml सेट करने के लिए इस तरह दिखेगा:

config = YAML::load(IO.read(File.dirname(__FILE__) + "/../config/database.yml")) 
ActiveRecord::Base.logger = Logger.new(File.dirname(__FILE__) + "/../log/debug.log") 
ActiveRecord::Base.establish_connection(config["test"]) 
load(File.dirname(__FILE__) + "/../db/schema.rb") 
:

test: 
adapter: sqlite3 
database: ":memory:" 

आप भी अपने स्कीमा तो जैसे अपने परीक्षण सहायक में स्मृति डेटाबेस में अपने में लोड करना होगा

+0

आपको परीक्षण में कनेक्शन स्थापित करने की आवश्यकता क्यों होगी? मैंने सोचा था कि रेल कुछ आपके लिए करेगा। –

+0

मैंने यह भी किया है और यह मीठा है, लेकिन मैंने इसे और MySQL/PostgreSQL के बीच अंतरों के कारण स्थानीय रूप से SQLite का उपयोग करना बंद कर दिया। ActiveRecord अधिकांश विवरण छुपाता है लेकिन इसे परेशान करने में पर्याप्त अंतर है। –

+0

परीक्षण चलाने से पहले कनेक्शन स्थापित किया जाना चाहिए ताकि रेल लोड होने से पहले स्कीमा को स्मृति डेटाबेस में लोड किया जा सके। एकमात्र जगह जिसे मैं लोड करने के बारे में जानता हूं वह परीक्षण सहायक में है, और इस बिंदु पर रेलवे द्वारा डेटाबेस में कोई कनेक्शन नहीं है। अगर मैं गलत हूं, तो कृपया मुझे सही करें, या अगर ऐसा करने का कोई आसान तरीका है। –

1

परीक्षण उद्देश्यों के लिए https://github.com/mvz/memory_test_fix प्लग-इन पर विचार करें। यह database.yml अद्यतन करने के लिए और चलाने के लिए

rails plugin install git://github.com/mvz/memory_test_fix.git 

तुम भी कोशिश कर सकते हैं memory_test_fix मणि स्थापित करने जितना आसान उपयोग है, लेकिन यह अलग Git शाखा से है और रेल 3.

मणि मुझे मदद की परीक्षा को कम करने का समर्थन नहीं करता मामला निष्पादन समय 25 सेकंड से 19. तक। दूसरी ओर, यह डेटाबेस स्कीमा प्रारंभिकरण पर 2 सेकंड ओवरहेड पेश करता है (और मेरे पास उनमें से अधिकतर नहीं है)। तो परीक्षण के छोटे सेट पर परेशान करने लायक नहीं है।

जेसन स्टीवर्ट के उत्तर से समाधान मूल रूप से वही है। और मैंने इसे प्लगइन के बजाय इस्तेमाल किया, क्योंकि इसे स्पार्क प्लग-इन के साथ जोड़ना आसान था।

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