2009-07-28 25 views
50

मैं अपनी सभी पोस्ट हटाने के लिए Post.delete_all कर सकता हूं, लेकिन अगर मैं सभी पोस्ट, टिप्पणियां, ब्लॉग इत्यादि को हटाना चाहता हूं तो क्या होगा?रेल में सभी तालिकाओं से सभी डेटा कैसे हटाएं?

मैं अपने सभी मॉडलों पर कैसे पुन: प्रयास करूं और delete_all विधि चला सकता हूं?

उत्तर

70
rake db:reset 

यह आपकी तालिका माइग्रेशन से पुन: प्रयास करता है।

के रूप में टिप्पणी में सुझाव दिया, एक तेज़ तरीका यह करने के लिए (लेकिन आप एक नया रेक कार्य जोड़ने के लिए है): answer on SO:

namespace :db do 
    desc "Truncate all tables" 
    task :truncate => :environment do 
    conn = ActiveRecord::Base.connection 
    tables = conn.execute("show tables").map { |r| r[0] } 
    tables.delete "schema_migrations" 
    tables.each { |t| conn.execute("TRUNCATE #{t}") } 
    end 
end 

रिस्पांस से नकल।

+1

अच्छा, हालांकि मैं एक ऐसी विधि पसंद करूंगा जिसमें सभी तालिकाओं को छोड़ने और फिर से बनाने की आवश्यकता न हो। –

+2

* बस * तालिका पंक्तियों को हटाने के लिए एक तेज़, अधिक सटीक तरीका TRUNCATE कमांड का उपयोग करना है: http://stackoverflow.com/a/6332189/109618 –

+0

यह एक अपवाद फेंकता है जब मैं इसे चलाने की कोशिश करता हूं, जाहिर है, [sqlite TRUNCATE कमांड नहीं है] (http://www.sqlite.org/lang.html)। –

26

आप के साथ बेहतर नियंत्रण हो सकता है:

rake db:drop:all 

और फिर माइग्रेशन चलने के बिना डेटाबेस बनाने,

rake db:create:all 

फिर अपने सभी माइग्रेशन चलाने के लिए,

rake db:migrate 

आप कर सकते हैं यह भी करें:

mysqladmin drop databasename 
+0

'रेक डीबी: ड्रॉप: सब' वही है जो मैं ढूंढ रहा था। धन्यवाद! – sivabudh

+4

'रेक डीबी: ड्रॉप: सभी' ने मेरे लिए उत्पादन डेटाबेस छोड़ने की कोशिश की। – vaughan

+2

__ चेतावनी: __ यह डिफ़ॉल्ट _development_ पर्यावरण में सभी तालिकाओं को छोड़ देगा। बेहतर नियंत्रण – Anwar

20

आप आदेश पंक्ति के बजाय कोड से ऐसा करने की कोशिश कर रहे हैं, तो कहते हैं कि एक Test::Unit::TestCase#teardown विधि से, तुम कर सकते हो या तो

class MyTest < Test::Unit::TestCase 

    def teardown 
    ActiveRecord::Base.subclasses.each(&:delete_all) 
    end 

end 

या

class MyTest < Test::Unit::TestCase 

    def teardown 
    Rake::Task['db:reset'].invoke 
    end 

end 

मैं आपको चेतावनी देता, हालांकि: न तो विशेष रूप से तेज़ है। यदि आप कर सकते हैं तो आप लेनदेन परीक्षणों के साथ निश्चित रूप से बेहतर हैं।

+1

के लिए 'RAILS_ENV' पर्यावरण चर का उपयोग करें मैंने रेल 4 के साथ यह कोशिश की और उत्सुकता से डेटा हटाया नहीं गया – Besi

15

आप बस खाली टेबल के एक ताजा सेट के साथ नए सिरे से शुरू करना चाहते हैं, तो आपको पहले सुनिश्चित कर सकते हैं आप db/schema.rb में स्कीमा की एक अप-टू-डेट परिभाषा है:

rake db:schema:dump 

और तो:

rake db:schema:load 

जो माइग्रेशन के पूरे बैटरी के माध्यम से चलने के बिना छोड़ने टेबल के प्रभाव और उसके बाद उन्हें फिर से बनाने, है।

+0

यह सभी माइग्रेशन – juliangonzalez

2

मुझे पता है कि यह एक पुराना सवाल है, लेकिन मैंने सोचा कि यह किसी के लिए सहायक हो सकता है। डेटाबेस से सभी डेटा साफ़ करने का यह एक तेज़ तरीका है।

tables = [] 
ActiveRecord::Base.connection.execute("show tables").each { |r| tables << r[0] } 
tables = tables - ["schema_migrations"] 
tables.each do |table| 
    ActiveRecord::Base.connection.execute("DELETE FROM #{table} WHERE 1 = 1") 
end 

मैं इस तकनीक का उपयोग after(:all) ब्लॉक में कुछ चश्मे में करता हूं। यह डेटाबेस को रीजिंग, माइग्रेट करने, रीसेट करने के लिए किसी भी रेल रेक कार्यों की तुलना में बहुत तेज़ और अधिक कुशल है।

बीटीडब्ल्यू: मुझे पूरा यकीन है कि यदि आप डेटाबेस पक्ष पर विदेशी कुंजी बाधाओं को लागू कर रहे हैं तो यह असफल हो जाएगा।

10

पर एक तेज़ तरीका तालिका पंक्तियों को हटाएं TRUNCATE कमांड का उपयोग करना है।

कई अन्य उत्तरों पंक्तियों को हटाने और तालिका छोड़ने के बीच के अंतर को अनदेखा करते हैं। तालिका को छोड़ना तालिका डेटा और स्कीमा को नष्ट कर देता है; जिसका अर्थ है कि आपको टेबल को फिर से बनाने के लिए अतिरिक्त चरणों की आवश्यकता है। शॉन मैकलेरी का जवाब मैंने देखा सबसे अच्छा था, इसलिए मैंने इसे शुरुआती बिंदु के रूप में इस्तेमाल किया। हालांकि, मुझे लगता है कि TRUNCATE कमांड का लाभ उठाना बेहतर है, क्योंकि यह तेज़ होना चाहिए और यह स्वत: वृद्धि कुंजी को भी रीसेट करता है। इसके अलावा, के बजाय map का उपयोग करके कोड को थोड़ा सा छोटा कर देता है।

namespace :db do 
    desc "Truncate all tables" 
    task :truncate => :environment do 
    conn = ActiveRecord::Base.connection 
    tables = conn.execute("show tables").map { |r| r[0] } 
    tables.delete "schema_migrations" 
    tables.each { |t| conn.execute("TRUNCATE #{t}") } 
    end 
end 
+0

चला गया क्यों" schema_migrations "को हटाएं? – nurettin

+0

nurettin: 'schema_migrations' को हटाने, कड़ाई से बोलना, आवश्यक नहीं है। हालांकि, टेबल को छंटनी के बाद आपने अपना डेटा उस राज्य में डाल दिया है जो अब माइग्रेशन के माध्यम से नेविगेट नहीं किया जा सकता है। इसलिए, 'schema_migrations' को हटाने से रेल एक ज्ञात स्थिति से माइग्रेशन को पुनरारंभ करने देता है। –

3

हम database_cleaner gem उल्लेख नहीं करने के लिए यहाँ स्टैक ओवरफ़्लो पर बेपरवाह किया गया है:

डाटाबेस क्लीनर रूबी में अपने डेटाबेस की सफाई के लिए रणनीति का एक सेट है। मूल उपयोग केस परीक्षण के दौरान एक स्वच्छ राज्य सुनिश्चित करना था। प्रत्येक रणनीति कोड की एक छोटी राशि है लेकिन वह कोड है जिसे किसी भी रूबी ऐप में आमतौर पर आवश्यक होता है जो डेटाबेस के साथ परीक्षण कर रहा है।

'रणनीति' द्वारा, श्री मैबे का अर्थ है: छंटनी, लेनदेन, और हटाना।

ActiveRecord, DataMapper, Sequel, MongoMapper, Mongoid, और CouchPotato समर्थित हैं।

यहाँ Database Cleaner README से एक त्वरित कोड स्निपेट है:

require 'database_cleaner' 
DatabaseCleaner.strategy = :truncation 

# then, whenever you need to clean the DB 
DatabaseCleaner.clean 
3
# fast truncation of all tables that need truncations (select is 10x faster then truncate) 
# http://grosser.it/2012/07/03/rubyactiverecord-fastest-way-to-truncate-test-database/ 
def truncate_all_tables 
    connection = ActiveRecord::Base.connection 
    connection.disable_referential_integrity do 
    connection.tables.each do |table_name| 
     next if connection.select_value("SELECT count(*) FROM #{table_name}") == 0 
     connection.execute("TRUNCATE TABLE #{table_name}") 
    end 
    end 
end 
4

आप बीज फ़ाइल (seeds.rb) में सभी मॉडलों सूचीबद्ध कर सकते हैं, और बस चलाने

rake db:seed 

बीज फ़ाइल तब कुछ इस तरह दिखाई देगी:

Model1.delete_all 
Model2.delete_all 
Model3.delete_all 
Model4.delete_all 
Model5.delete_all 
Model6.delete_all 
Model7.delete_all 

...

rake db:reset आपके काम के लिए बहुत अधिक है। यह पूरी तरह से आपके डेटाबेस को मार देगा और स्क्रैच से इसे पुनर्निर्माण करेगा, सभी माइग्रेशन इत्यादि चलाएगा। बीज कमांड चलाने के लिए तेज़ है। Postgres db के साथ

3

स्वीकृत जवाब:

namespace :db do 
    desc "Truncate all tables" 
    task :truncate => :environment do 
    conn = ActiveRecord::Base.connection 
    postgres = "SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname='public'" 
    tables = conn.execute(postgres).map { |r| r['tablename'] } 
    tables.delete "schema_migrations" 
    tables.each { |t| conn.execute("TRUNCATE \"#{t}\"") } 
    end 
end 
4

इस रेल 4

(ActiveRecord::Base.connection.tables - ['schema_migrations']).each do |table| 
    table.classify.constantize.destroy_all 
end 
+0

यह मेरे लिए ठीक काम करता है, रेल 4, स्क्लाइट। साफ़ - सुथरा तरीका। नोट हालांकि, यह एक त्रुटि उत्पन्न हुई जब इसे मेरी कई_to_many तालिका का सामना करना पड़ा, जिसे एआर मॉडल द्वारा समर्थित नहीं किया गया है। मुझे इसे 'tablema' सरणी से उसी तरह से निकालना था जैसा कि 'schema_migrations' के लिए किया गया है। –

1

मेरे 50 सेंट, डाटाबेस और माइग्रेशन फिर से चलाने के लिए सक्षम सफाई (मामलों में जब आप डेटाबेस, जैसे एडब्ल्यूएस आरडीएस नहीं हटा सकते हैं) के लिए:

# get connection 
conn = ActiveRecord::Base.connection 
# find all tables needed to be removed 
tables = conn.execute("SELECT * FROM pg_catalog.pg_tables WHERE schemaname='public' AND tablename<>'schema_migrations'").to_a.map { |r| r['tablename'] } 
# remove all tables except schema_migrations 
tables.each { |t| conn.execute("DROP TABLE #{t}") } 
# clean migrations table 
conn.execute("TRUNCATE TABLE schema_migrations") 

और अब आप कर सकते हैं स्वच्छ स्थिति में अपना डीबी रखने के लिए rake db:migrate चलाएं।

2

आप जबकि यह आपके आवेदन के अंदर का उपयोग कर या रेल तालिकाओं को बिना छुए केवल डेटा हटाना चाहते हैं कंसोल:

Rails.application.eager_load! 
ActiveRecord::Base.connection.disable_referential_integrity do 
    ApplicationRecord.descendants.each do |model| 
    model.delete_all 
    end 
end 
इस कोड के साथ

, यदि आप स्वयं अपनी मॉडल को संदर्भित साथ परेशान करने के लिए नहीं है और/या विदेशी कुंजी बाधाओं के साथ (अक्षम_referential_integrity के लिए धन्यवाद)।
ApplicationRecord.descendants ActiveRecord :: Base.descendants (कोई और एप्लिकेशन रिकॉर्ड, schema_migrations और ar_internal_metadata) के विपरीत केवल वास्तविक अनुप्रयोग मॉडल लौटाता है।

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