रेल में सिंगल टेबल कैसे रीसेट करें?


86

मैं प्राथमिक कुंजी मानों को 1 से फिर से शुरू करना चाहता हूं।

जवाबों:


27

SQLite में सूचकांक / प्राथमिक कुंजी को रीसेट करने के लिए बस टाइप करें:

$ rails console
> ActiveRecord::Base.connection.execute("DELETE from sqlite_sequence where name = 'yourtablename'")

1
अपने उत्तर से प्रेरणा लेते हुए ...Person.connection.execute('delete from people' ) Person.connection.execute("update sqlite_sequence set seq = 0 where name = 'People'" )
mamesaye

1
मामले में किसी ने भी यह कोशिश की और एक त्रुटि मिली, मैंने किया ActiveRecord::Base.connection.execute("DELETE from 'yourtablename'")और यह काम किया क्योंकि यह मुझे एक त्रुटि देगा जो कहा sqlite_sequence where name = 'yourtablename' is not a valid table nameया ऐसा कुछ था।
l1zZY

184

बहुत सारे लोग (मेरे जैसे) यहां यह जानने के लिए आते हैं कि तालिका के सभी डेटा को कैसे हटाया जाए। हेयर यू गो:

$ rails console

> ModelName.delete_all

या

> ModelName.destroy_all

ru_all निर्भरता और कॉलबैक की जाँच करता है, और इसमें थोड़ा अधिक समय लगता है। delete_all एक सीधी SQL क्वेरी है।

यहाँ अधिक जानकारी: http://apidock.com/rails/ActiveRecord/Base/delete_all/class


14
यह समाधान तालिका प्रविष्टियों को रीसेट करता है, लेकिन प्राथमिक कुंजी को नहीं।
जस्टिन डी।

4
हाँ यह बहुत अच्छा है - लेकिन मैं सूचकांक को रीसेट करना चाहता हूं! न तो Delete_all या नष्ट_all सूचकांक को 1 पर रीसेट कर रहा है
Kyle Clegg

इस उत्तर ने उन बहुसंख्यक उपयोगकर्ताओं के प्रश्न को हल कर दिया जो उस तक पहुंचे। यही वास्तव में मायने रखता है। इसके अलावा, यह एकमात्र उत्तर नहीं है और इसे सही के रूप में चिह्नित नहीं किया गया है। लेखक ने उसका इरादा भी समझाया। इसलिए मुझे कोई समस्या नहीं दिख रही है।
एडीसन मचाडो

45

मैं तालिका में सब कुछ हटाने के लिए रेल कंसोल से निम्नलिखित का उपयोग कर रहा हूं और फिर सूचकांक काउंटर (रूबी 2 और रेल 4) रीसेट करें:

> ModelName.delete_all
> ActiveRecord::Base.connection.reset_pk_sequence!('plural_model_name')

3
यह मेरे लिए वास्तव में अच्छी तरह से काम करता है, लेकिन एक छोटा सा विवरण यह है कि model_nameरीसेट कमांड में आपके को बहुवचन की जरूरत है, जैसे तालिका का वास्तविक नाम मॉडल का एकवचन नाम नहीं है।
एली ड्यूक

प्रतीकात्मक संस्करण के साथ भी काम करता है ActiveRecord::Base.connection.reset_pk_sequence!(:plural_model_name):।
क्रिस Cirefice

18

@ khelll का लिंक मददगार है। कमांड जिसे आप एक तालिका से अलग करना चाहते हैं वह है:

ActiveRecord::Base.connection.execute("TRUNCATE #{table_name}")

16

4.2 के बाद से आप truncateसीधे ActiveRecord कनेक्शन पर उपयोग कर सकते हैं :

ActiveRecord::Base.connection.truncate(:table_name)

यह सभी डेटा मिटा और autoincrement काउंटर रीसेट करता है तालिका में। MySQL और Postgres में काम करता है , Sqlite में काम नहीं करता है


10

gem 'database_cleaner'अपने Gemfile में जोड़ें , दौड़ें $ bundle install, और फिर:

> DatabaseCleaner.clean_with(:truncation, :only => ['yourtablename'])

आप अधिक तालिकाएँ निर्दिष्ट कर सकते हैं:

> DatabaseCleaner.clean_with(:truncation, :only => ['table1', 'table2', 'table3'])

यदि आप अंतिम पैरामीटर को छोड़ देते हैं, तो यह पूरे डेटाबेस को अलग कर देगा:

> DatabaseCleaner.clean_with(:truncation) # your database is truncated

6

मैं रेल का उपयोग कर रहा हूँ 4.2.0 और Sqlite3

यहाँ मेरे लिए क्या काम किया गया (उपरोक्त सभी से थोड़ा सा लेना):

$ rails c
> ModelName.delete_all
> ActiveRecord::Base.connection.execute("DELETE from sqlite_sequence where name = 'table_name'")

मैं तब 1 पर वापस शुरू होने वाले सूचकांक के साथ अपनी तालिका में नए रिकॉर्ड जोड़ने में सक्षम था


1

किसी और के लिए इस प्रश्न के उत्तर की तलाश में जब डेटाबेस Postgres है, तो आप इसे रेल कंसोल से कर सकते हैं:

rails console
irb(main):028:0> ActiveRecord::Base.connection.execute("SELECT SETVAL('accounts_id_seq', 1)")

कहाँ accountsमें accounts_id_seqतालिका का नाम है।

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