Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

रेल एक MySQL कथन कैसे बनाते हैं?

एसक्यूएल आज़माएं?

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

# All on one line:
Artist.find_by_sql
  "SELECT `artists`.* FROM `artists` 
   WHERE `artists`.`id` = #{params[:artist_id].to_i} LIMIT 1"

ARel/MySQL समझाएं?

रेल यह समझाने में मदद कर सकती है कि MySQL क्या करने की कोशिश कर रहा है:

Artist.find(params[:artist_id]).explain

http://weblog.rubyonrails.org/2011/12/6/what-s-new-in-edge-rails-explain/

शायद आप उन प्रश्नों के बीच किसी प्रकार का अंतर खोज सकते हैं जो सफल हो रहे हैं और असफल हो रहे हैं, जैसे कि explain अनुक्रमणिका या अनुकूलन का उपयोग करता है।

mysql2 रत्न?

क्या आप MySQL मणि से mysql2 मणि ​​में बदलने का प्रयास कर सकते हैं? जब आप mysql2 रत्न पर स्विच करते हैं तो आपको क्या विफलता मिलती है?

अस्थिरता?

शायद कुछ और है जो फ्लाई पर पैरा हैश बदल रहा है, इसलिए जब आप इसे प्रिंट करते हैं तो आप इसे देखते हैं, लेकिन जब तक क्वेरी चलती है तब तक यह बदल जाता है?

जैसे ही आप पैरामीटर प्राप्त करते हैं, वेरिएबल असाइन करने का प्रयास करें:

artist_id = params[:artist_id]
... whatever code here...
@artist = Artist.find(artist_id)

पैरा हैश नहीं?

आपने लिखा "मतलब रेल पैराम्स में नहीं गुजर रहा है [:artist_id] जो स्पष्ट रूप से पैरा हैश में है।" मुझे नहीं लगता कि यह समस्या है-- मुझे उम्मीद है कि आप इसे देख रहे हैं क्योंकि रेल "?" तैयार विवरण के लिए प्लेसहोल्डर के रूप में।

पता लगाने के लिए, @Mori द्वारा सुझाए गए आदेशों को चलाएँ और उनकी तुलना करें; वे एक जैसे होने चाहिए।

Article.find(42).to_sql
Article.find(params[:artist_id]).to_sql

तैयार किए गए कथन?

एक तैयार स्टेटमेंट कैश समस्या हो सकती है, जब क्वेरी वास्तव में निष्पादित की जाती है।

यह रहा वह कोड जो विफल हो रहा है-- और एक बड़ी मोटी चेतावनी है।

begin
  stmt.execute(*binds.map { |col, val| type_cast(val, col) })
rescue Mysql::Error => e
  # Older versions of MySQL leave the prepared statement in a bad
  # place when an error occurs. To support older mysql versions, we
  # need to close the statement and delete the statement from the
  # cache.
  stmt.close
  @statements.delete sql
  raise e
end

तैयार किए गए कथनों को बंद करने के लिए अपने डेटाबेस को कॉन्फ़िगर करने का प्रयास करें, यह देखने के लिए कि क्या इससे कोई फर्क पड़ता है।

आपके ./config/database.yml . में फ़ाइल:

production:
   adapter: mysql
   prepared_statements: false
   ...

तैयार बयानों के साथ बग?

इस सेटिंग को अनदेखा करने वाले रेल के साथ कोई समस्या हो सकती है। यदि आप इसके बारे में और अधिक जानना चाहते हैं, तो जेरेमी कोल और आरोन द्वारा यह चर्चा और बग फिक्स देखें:https://github.com/rails/rails/pull/7042

हेरोकू सेटिंग को अनदेखा कर सकता है। यहां एक तरीका है जिससे आप तैयार_स्टेटमेंट सेटअप को पैच करके हेरोकू को ओवरराइड करने का प्रयास कर सकते हैं:https://github.com /रेल/रेल/मुद्दे/5297

क्वेरी कैश निकालें?

यह देखने के लिए कि क्या इससे कोई फर्क पड़ता है, ActiveRecord QueryCache को निकालने का प्रयास करें:

config.middleware.delete ActiveRecord::QueryCache

http://edgeguides.rubyonrails.org/configuring.html#configuring-middle

पोस्टग्रेज आज़माएं?

यदि आप Postgres आज़मा सकते हैं, तो यह इसे भी साफ़ कर सकता है। यह आपके लिए दीर्घकालिक समाधान नहीं हो सकता है, लेकिन यह समस्या को MySQL से अलग कर देगा।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. लुइगी वर्कफ़्लो में MySQL लक्ष्य

  2. mysql sproc में तालिका नाम के लिए एक चर का उपयोग करें

  3. चयन, समूह द्वारा और गिनती का उपयोग करते समय मैं एक खाली खाली परिणाम कैसे प्राप्त कर सकता हूं?

  4. सी # का उपयोग कर पर्यावरण परिवर्तनीय पथ कैसे सेट करें

  5. जावा से MySQL में एक छवि सहेजा जा रहा है