6

अभी मैं SQLite से Postgresql में माइग्रेट करने के बीच में हूं और मैं इस समस्या से आया हूं। निम्नलिखित तैयार बयान SQLite के साथ काम करता है:रेल में पोस्टग्रेस्क्ल पर तैयार वक्तव्य

id = 5 
st = ActiveRecord::Base.connection.raw_connection.prepare("DELETE FROM my_table WHERE id = ?") 
st.execute(id) 
st.close 

दुर्भाग्य से यह Postgresql के साथ काम नहीं है - यह पंक्ति 2. में एक अपवाद फेंकता मैं समाधान के लिए देख रहा था और इस में आए:

id = 5 
require 'pg' 
conn = PG::Connection.open(:dbname => 'my_db_development') 
conn.prepare('statement1', 'DELETE FROM my_table WHERE id = $1') 
conn.exec_prepared('statement1', [ id ]) 

यह एक पंक्ति 3. में विफल रहता है जब मैं प्रिंट की तरह इस

rescue => ex 

पूर्व अपवाद इस

शामिल
{"connection":{}} 

कमांड लाइन में SQL को निष्पादित करना काम करता है। कोई आइडिया है कि मैं क्या गलत कर रहा हूँ?

अग्रिम धन्यवाद!

+0

मैं इसे कैसे ढूंढ सकता हूं? मैं पूछ रहा हूं क्योंकि अपवाद के संबंध में कंसोल में कोई आउटपुट नहीं है। –

उत्तर

20

आप prepare उस तरह उपयोग करने के लिए तो आप एक जोड़े को परिवर्तन करने के लिए की आवश्यकता होगी चाहते हैं:

  1. PostgreSQL ड्राइवर गिने प्लेसहोल्डर देखना चाहता है ($1, $2, ...) के निशान सवाल नहीं और आप अपने तैयार बयान एक नाम देने की जरूरत है:

    ActiveRecord::Base.connection.raw_connection.prepare('some_name', "DELETE FROM my_table WHERE id = $1") 
    
  2. बुला अनुक्रम prepareexec_prepared द्वारा पीछा किया जाता है:

    connection = ActiveRecord::Base.connection.raw_connection 
    connection.prepare('some_name', "DELETE FROM my_table WHERE id = $1") 
    st = connection.exec_prepared('some_name', [ id ]) 
    

ऊपर दृष्टिकोण ActiveRecord और PostgreSQL के साथ मेरे लिए काम करता है, अपने PG::Connection.open संस्करण अगर आप ठीक से कनेक्ट कर रहे हैं काम करना चाहिए।

एक और तरीका है अपने आप को उद्धृत करते हुए करना है:

conn = ActiveRecord::Base.connection 
conn.execute(%Q{ 
    delete from my_table 
    where id = #{conn.quote(id)} 
}) 

बात की तरह है कि ActiveRecord आमतौर पर अपनी पीठ के पीछे क्या कर रहा है है कि।

सीधे डेटाबेस के साथ बातचीत करना रेल के साथ एक गड़बड़ी हो जाता है क्योंकि रेल लोग नहीं सोचते कि आपको कभी ऐसा करना चाहिए।

आप वास्तव में सिर्फ हस्तक्षेप के बिना एक पंक्ति को हटाने के लिए कोशिश कर रहे हैं, तो आप delete इस्तेमाल कर सकते हैं:

हटाना()

[...]

पंक्ति बस है रिकॉर्ड की प्राथमिक कुंजी पर SQL DELETE कथन के साथ हटा दिया गया है, और कोई कॉलबैक निष्पादित नहीं किया गया है।

तो आप बस यह कह सकता हूँ:

MyTable.delete(id) 

और आप डेटाबेस में एक साधारण delete from my_tables where id = ... भेज देंगे।

+0

आप सही थे - बयान को एक नाम देकर और एक प्रश्न चिह्न के बजाय डॉलर चार का उपयोग करके नौकरी की। मुझे डिलीट फ़ंक्शन के बारे में पता है - इस मामले में मैं एक संयुक्त तालिका से कुछ हटा रहा हूं जिसमें इसका अपना मॉडल नहीं है। एक बनाने के बजाय मैं एक "त्वरित" समाधान के लिए चला गया। धन्यवाद! –

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