डेटाबेस तालिका में सभी रिकॉर्ड हटाना


जवाबों:


249

यदि आप SQL के बिना इसके लिए एक रास्ता खोज रहे हैं तो आपको delete_all का उपयोग करने में सक्षम होना चाहिए।

Post.delete_all

या एक मापदंड के साथ

Post.delete_all "person_id = 5 AND (category = 'Something' OR category = 'Else')"

अधिक जानकारी के लिए यहाँ देखें ।

रिकॉर्ड्स को पहले लोड किए बिना डिलीट कर दिया जाता है जो इसे बहुत तेज़ बनाता है लेकिन काउंटर कैश जैसी कार्यक्षमता को तोड़ देगा जो डिलीट करने के लिए निष्पादित किए जाने वाले रेल कोड पर निर्भर करता है।


13
यह ध्यान देने योग्य है कि यदि आपको इसके साथ संबद्धता मिली है: निर्भर =>: नष्ट करें, या कुछ भी जिसे हटाने पर साफ करने की आवश्यकता है, तो आप शायद Post.destroy_all चाहते हैं - हालांकि यह बहुत धीमी है। देखें apidock.com/rails/ActiveRecord/Base/destroy_all/class
माइकल Hellein

यह उत्तर मानता है कि तालिका में एक मॉडल जुड़ा हुआ है। ओपी ने यह निर्दिष्ट नहीं किया - क्या होगा यदि तालिका एक सम्मिलित तालिका है?
टॉबी 1 केनोबी

1
@ ब्रैडवर्थ को कुछ लोगों द्वारा अच्छी या बुरी शैली माना जाता है या नहीं, मैं सिर्फ यह कह रहा हूं कि यह संभव है कि एक रेल डीबी में टेबल हैं जो ActiveRecordमॉडल नहीं हैं। प्रश्न एक 'तालिका' से रिकॉर्ड हटाने के बारे में पूछता है और मैं केवल इंगित कर रहा हूं या उत्तर में आयोजित धारणा।
टोबी 1 केनोबी

मेरे पास @ Toby1Kenobi की क्वेरी समान है।
nbsamar

30

SQL के माध्यम से हटाने के लिए

Item.delete_all # accepts optional conditions

प्रत्येक मॉडल की विध्वंस विधि को कॉल करके हटाना (महंगी लेकिन यह सुनिश्चित करता है कि कॉलबैक कहा जाए)

Item.destroy_all # accepts optional conditions

यहाँ सब


21

यदि आप डेटाबेस को पूरी तरह से खाली करना चाहते हैं और न केवल एक मॉडल या उससे जुड़ी मॉडल को हटा सकते हैं जो आप कर सकते हैं:

rake db:purge

आप इसे परीक्षण डेटाबेस पर भी कर सकते हैं

rake db:test:purge

5

यदि आप सभी मॉडलों के हर उदाहरण को हटाते हैं, तो मैं उपयोग करूंगा

ActiveRecord::Base.connection.tables.map(&:classify)
  .map{|name| name.constantize if Object.const_defined?(name)}
  .compact.each(&:delete_all)

1
selectजब भी आपको किसी ब्लॉक के अंदर अभिव्यक्ति का उपयोग करने की आवश्यकता हो तो इस तरह से प्राथमिकता दें , इस तरह से आप शून्य तत्वों को निकालने के लिए कॉम्पैक्ट विधि को चेन करने से बचें।
सेबस्टियन पाल्मा

4
BlogPost.find_each(&:destroy)

यह कम स्मृति परिस्थितियों के लिए बहुत अच्छा है।
एपिगीन

यह एकमात्र उत्तर है जो मेमोरी खपत को ध्यान में रखता है।
जॉन

2
ओमग, इसके लिए एक लूप क्यों बनाया जाए ... कोई मतलब नहीं। बस सभी रिकॉर्ड डिलीट करें टेबल से, Model.delete_all
Imnl

@ जॉन क्यों एक एकल क्वेरी प्रश्नों की एक लूप की तुलना में अधिक मेमोरी खपत करता है?
इम्नल

@Imnl प्रत्येक पुनरावृत्ति प्रश्न में मॉडल के एक नए उदाहरण को तत्काल बदल देती है ताकि वह डिलीट विधि के लिए कॉलबैक की प्रक्रिया कर सके।
जॉन

2

यदि आपका मॉडल BlogPost कहलाता है, तो यह होगा:

BlogPost.all.map(&:destroy)

यह हर एक BlogPost को लाएगा और उन्हें नष्ट करने से पहले रूबी सरणी में लोड करेगा।
hdgarrood

ओआरएम पर निर्भर करता है। डाटामॅपर ऐसा नहीं करेगा क्योंकि आप प्रत्येक मॉडल के बारे में कुछ भी अनुरोध नहीं कर रहे हैं। और यहाँ एक मोंगॉइड स्टैकट्रेस है जो यह दर्शाता है कि प्रत्येक प्रविष्टि को नष्ट करने से पहले यह किसी भी क्षेत्र का चयन नहीं करता है:MOPED: 127.0.0.1:27017 QUERY database=a_database collection=nothings selector={} flags=[:slave_ok] limit=0 skip=0 batch_size=nil fields=nil (0.3378ms)
stef

4
चूंकि यह एक रेल का सवाल है, और पूछने वाले ने यह नहीं कहा कि वह किस ORM का उपयोग कर रहा है, हमें ActiveRecord मान लेना चाहिए
hdgarrood

2

उस मामले में अधिक हालिया उत्तर जिसे आप प्रत्येक तालिका में हर प्रविष्टि को हटाना चाहते हैं:

def reset
    Rails.application.eager_load!
    ActiveRecord::Base.descendants.each { |c| c.delete_all unless c == ActiveRecord::SchemaMigration  }
end

eager_load यहाँ के बारे में अधिक जानकारी ।

इसे कॉल करने के बाद, हम सभी के वंशजों तक पहुंच सकते हैं ActiveRecord::Baseऔर हम delete_allसभी मॉडलों पर आवेदन कर सकते हैं।

ध्यान दें कि हम स्कीमा माइग्रेशन तालिका को साफ़ नहीं करना सुनिश्चित करते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.