2012-03-28 15 views
14

मैंने इस असाधारण सरल प्रश्न का उत्तर देने के लिए Google का उपयोग करने का प्रयास किया है, लेकिन मेरे आश्चर्य के लिए, इससे मदद नहीं मिली।आप mysql2 मणि ​​के साथ तैयार कथन कैसे बनाते हैं?

मेरे पास वर्तमान में mysql मणि के साथ 'तैयार' विधि का उपयोग कर मेरे रेल अनुप्रयोग में कोड है। mysql2 का उपयोग करने जा पर, इस त्रुटि के साथ टूट जाता है:

undefined method `prepare' for #<Mysql2::Client::0....... 

तो मैं 'तैयार' विधि का एक संस्करण की तलाश की कोशिश की लेकिन यह खोज अब तक असफल रही है। क्या कोई भी इस के साथ मेरी मदद कर सकता है?

संपादित करें: यदि यह संभव नहीं है, तो क्या कोई मुझे बता सकता है कि mysql2 लाइब्रेरी में कुछ के साथ मेरे प्रश्नों को पैरामीटर करने का कोई तरीका है या नहीं?

उत्तर

5

mysql2 मणि अब documentation के अनुसार तैयार बयान का समर्थन करता है।

वाक्य रचना इस प्रकार है:

statement = @client.prepare("SELECT * FROM users WHERE login_count = ?") 
result1 = statement.execute(1) 
result2 = statement.execute(2) 

यह जून 2015 में

+1

पर यह और अन्य सेटिंग्स देखें! इसमें केवल कुछ साल लगे। – Nikhil

+0

यह समर्थन mysql2 में 0.4.0+ से है –

14

अद्यतन

Ryan Rapp के रूप में सही ढंग से कहा, mysql2 अब तैयार बयान का समर्थन करता है। निम्नलिखित स्निपेट readme से निकाला जाता है:

statement = @client.prepare("SELECT * FROM users WHERE login_count = ?") 
result1 = statement.execute(1) 
result2 = statement.execute(2) 

statement = @client.prepare("SELECT * FROM users WHERE last_login >= ? AND location LIKE ?") 
result = statement.execute(1, "CA") 

धन्यवाद रयान!

मूल पोस्ट

मैं ऐसी कोई समारोह पाया या तो; न तो source में और न ही documentation में। शायद निम्न स्निपेट आपकी आवश्यकताओं के लिए एक उपयोगी प्रतिस्थापन है? (Mysql2 मणि ​​के प्रलेखन में पाया):

escaped = client.escape("gi'thu\"bbe\0r's") 
results = client.query("SELECT * FROM users WHERE group='#{escaped}'") 
+0

मैं एक तरह से parametrized प्रश्नों का उपयोग करने के लिए की तरह मैंने पहले था के लिए उम्मीद कर रही थी किसी मर्ज किए गए पुल अनुरोध के साथ added था। "मेरी तालिका से * चुनें * mycolumn1 =?" और इसी तरह। फिंगर्स कुछ ऐसा खोजने के लिए पार हो गए। – Nikhil

+0

इसे स्वीकार किया गया क्योंकि बॉक्स से बाहर करने का कोई तरीका नहीं है। मेरी रूबी लिपि में रेल के बाहर इस्तेमाल किए गए सक्रिय रिकॉर्ड के साथ इसे लपेटकर समाप्त कर दिया। धन्यवाद। – Nikhil

+15

पैरामीटरयुक्त प्रश्नों का समर्थन नहीं करने के लिए आधुनिक डेटाबेस इंटरफ़ेस के लिए कितना अविश्वसनीय रूप से निराशाजनक – wmarbut

3

मैं बदली mysql2 के बजाय https://github.com/tmtm/ruby-mysql उपयोग करने के लिए। मुझे आश्चर्य है कि यह mysql2 मणि ​​का उपयोग करने वाले लोगों के लिए एक बड़ा सौदा-ब्रेकर नहीं है। मुझे लगता है कि एसक्यूएल लिखने में इस गहरे खुदाई करने वाले लोग पोस्टग्रेस्क्ल में बदल गए हैं?

मामले दूसरों में gem install ruby-mysqlrequire "mysql" द्वारा पीछा के साथ परेशानी हो रही है जहाँ आप एक रूबी त्रुटि 'read_eof_packet': packet is not EOF (Mysql::ProtocolError) तरह चाल gem uninstall ruby-mysql है gem install ruby-mysql-ext हो और बजाय (या अपने Gemfile में gem 'ruby-mysql-ext' का उपयोग करें) जो बाहर रूबी कार्यान्वयन जो नहीं है स्वैप जाएगा अभी तक सरल सी बाइंडिंग के लिए रूबी 2.0 संगत (या कम से कम, मेरे लिए काम नहीं किया)।

स्पष्ट होने के लिए, यदि आप require 'mysql' करते हैं, जबकि ruby-mysql-ext और ruby-mysql दोनों स्थापित हैं, तो यह रूबी संस्करण लोड करेगा। एक विशिष्ट मणि के भीतर आवश्यकता होने का एक तरीका हो सकता है, लेकिन मेरे पास इसे देखने का समय नहीं था।

0

मुझे आश्चर्य भी है कि तैयार विधि गुम है। निश्चित रूप से एक सामान्य ActiveRecord और MySQL 2 सेटअप में, ActiveRecord को libmysql का उपयोग करके तारों से बचने के लिए अवश्य होना चाहिए, जो मुझे थोड़ा सा चिंताजनक लगता है।

इस दौरान, आप उपयोग कर सकते हैं https://github.com/brianmario/mysql2/tree/stmt

0

रेल और MySQL सक्रिय रिकॉर्ड एडाप्टर जहाँ तक तैयार बयान के लिए कोई समर्थन नहीं है के रूप में मैं जानता हूँ कि:

http://patshaughnessy.net/2011/10/22/show-some-love-for-prepared-statements-in-rails-3-1

इसका कारण यह है कि वे वास्तव में तेजी से बयान में कोई उपयोग नहीं है और वास्तव में MySQL की क्वेरी प्लानिंग की कमी के कारण चीजों को धीमा कर सकता है।

+0

मुझे यकीन नहीं है कि यह अब सत्य है (या शायद तब भी!) क्योंकि आपको सर्वर-साइड तैयार कथन मैन्युअल रूप से चालू करना है, यह डिफ़ॉल्ट रूप से बंद है। Https://github.com/brettwooldridge/HikariCP/wiki/MySQL- कॉन्फ़िगरेशन –

1

हां, mysql2 एडाप्टर मौजूदा रेल 4.0 तक बाध्यकारी का समर्थन नहीं करता है। मैं आश्चर्यचकित हूँ! आप से ~/.rvm/रत्न/माणिक 2.1.1/रत्न/ActiveRecord-4.1.1/lib/active_record/connection_adapters/mysql2_adapter.rb

 def exec_query(sql, name = 'SQL', binds = []) 
     result = execute(sql, name) 
     ActiveRecord::Result.new(result.fields, result.to_a) 
     end 

     alias exec_without_stmt exec_query 

     # Returns an ActiveRecord::Result instance. 
     def select(sql, name = nil, binds = [])                              
     exec_query(sql, name) 
     end 

भी यह सहायक है कोड स्निप द्वारा इस बता सकते हैं आप के लिए समझ:

 # Returns an ActiveRecord::Result instance. 
     def select_all(arel, name = nil, binds = []) 
     if arel.is_a?(Relation) 
      relation = arel 
      arel = relation.arel                                  
      if !binds || binds.empty? 
      binds = relation.bind_values 
      end 
     end 

     select(to_sql(arel, binds), name, binds) 
     end 

(~/.rvm/रत्न/माणिक 2.1.1/रत्न/ActiveRecord-4.1.1/lib/active_record/connection_adapters/सार/database_statements.rb में) बस! और मुझे लगता है कि मैं पोस्टग्रेस पर जा सकता हूं !!

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