रेल डेटाबेस पर एक रूबी को शुद्ध करना या फिर से बनाना


582

मैं डेटा से भरा रेल डेटाबेस पर एक देव रूबी है। मैं सब कुछ हटाना चाहता हूं और डेटाबेस का पुनर्निर्माण करना चाहता हूं। मैं कुछ का उपयोग करने की सोच रहा हूँ जैसे:

rake db:recreate

क्या यह संभव है?


मेरा सुझाव है कि सबसे ऊंचे-ऊंचे उत्तर को देखते हुए। मेरी राय में rake db:drop db:create db:schema:loadइससे अधिक उपयुक्त हो सकता है rake db:drop db:create db:migrate(हालांकि मैं इसके बारे में गलत होने के लिए तैयार हूं)।
जेसन स्विट


2
rake db:drop db:create db:migrate
विलियम हैम्पशायर

db:drop + db:create + db:migrate == db:migrate:reset। मैं आमतौर पर सहारा लेता हूं db:schema:load, जब पलायन टूट जाता है। मुझे शायद ही डेटाबेस को फिर से बनाने की जरूरत है, इसलिए गति बहुत मायने नहीं रखती है। इसके अलावा, यदि आपके पास अप्रयुक्त माइग्रेशन हैं, db:schema:loadऔर db:resetउन्हें लागू नहीं करेंगे। यकीन नहीं है कि अगर यह एक तर्क है।
x-yuri

जवाबों:


1074

मैं ऐसा करने के दो तरीके जानता हूं:

यह आपके डेटाबेस को रीसेट करेगा और आपके वर्तमान स्कीमा को सभी के साथ पुनः लोड करेगा:

rake db:reset db:migrate

यह आपके db को नष्ट कर देगा और फिर इसे बनाएगा और फिर अपने वर्तमान स्कीमा को माइग्रेट करेगा:

rake db:drop db:create db:migrate

सभी परिदृश्यों में सभी डेटा खो जाएगा।


36
ऐसा लगता है कि rake db:resetसभी माइग्रेशन (कम से कम रेल 3 पर) भी चलते हैं, इसलिए वह सब होना चाहिए जो सही है?
प्लंडबर्ग

1
या, बल्कि, यह स्कीमा को समान छोड़ देता है जो सभी माइग्रेशनों को चला रहा है। लेकिन माइग्रेशन प्रति सेक्शन पर नहीं चलते हैं (इसलिए यदि आपके पास माइग्रेशन हैं जो डेटा सम्मिलित करते हैं, तो ऐसा नहीं होगा; इसके लिए, आपको वास्तव में एक db / seeds.rb फ़ाइल का उपयोग करना चाहिए)।
प्लिंडबर्ग

1
मुझे पता है कि ट्रैक्स GTD ऐप db के लिए: माइग्रेट काम नहीं करता था। मुझे db करना था: Sqlite3 से Postgres पर जाते समय रीसेट करें।
भूलभुलैया

11
आपको rake db:test:prepareपरीक्षण के लिए भी दौड़ना होगा , अन्यथा आपको एक त्रुटि मिलेगी जैसे:Could not find table 'things' (ActiveRecord::StatementInvalid)
s2t2

31
किसी ने स्पष्ट कर दिया कि बनाना चाहिए rake db:resetऔर rake db:drop db:create db:migrate पूरे दो अलग अलग बातें करते हैं । उत्तरार्द्ध पूरे ऐप डेटाबेस को मिटा देता है, इसे फिर से बनाता है और फिर स्कीमा ( db/schema.rbया db/structure.sql) को अपडेट करने के लिए हर माइग्रेशन से गुजरता है , लेकिन इसे बीज डेटा के साथ नहीं भरता है। इसके बजाय पहला इसके लिए एक उपनाम है rake db:drop db:schema:load db:seed, इसलिए यह पूरे ऐप डेटाबेस को मिटा देता है, लेकिन यह स्कीमा को अपडेट नहीं करता है , और फिर बीज डेटा के साथ पॉप्युलेट करता है। इसलिए, यदि आपने अपने माइग्रेशन में कुछ भी नहीं बदला है, तो सबसे पहले जल्दी है, बाद सुरक्षित है।
क्लाउडियो फ्लोरियन

157

रेल 4 पर, सभी की जरूरत है

$ rake db:schema:load

यह आपके DB पर संपूर्ण सामग्री को हटा देगा और सभी स्कीमाओं को एक-एक करके लागू किए बिना, स्कीमा को अपनी स्कीमा.rb फ़ाइल से पुनः बनाएगा।


6
रेल 3 के लिए भी काम करता है। उपयोगी है जब आप अपने परीक्षण डेटाबेस को गड़बड़ कर देते हैं और इसे उस कार्यशील संस्करण में रीसेट करना चाहते हैं जो आपके देव db से मेल खाता है
bigpotato

इसके लिए धन्यवाद। मुझे यह एहसास नहीं था db:dropऔर db:createबेमानी थे।
ग्रांट बर्ममीयर

3
यह स्कीमा को अपडेट नहीं करता है, यदि आप अपने माइग्रेशन को रिफलेक्टर करते हैं तो यह एक सुरक्षित तरीका नहीं है।
क्लाउडियो फ्लोरियन

यह मेरे लिए सबसे अच्छा जवाब है।
रॉक्सडुराज़ो

2
@ClaudioFloreani रिफैक्टिंग माइग्रेशन मुसीबत के लिए पूछ रहा है। एक बार दौड़ने के बाद, उन्हें स्थायी रूप से अकेला छोड़ दिया जाना चाहिए।
nrowegt

45

मैं टर्मिनल में निम्नलिखित एक लाइनर का उपयोग करता हूं।

$ rake db:drop && rake db:create && rake db:migrate && rake db:schema:dump && rake db:test:prepare

मैंने इसे शेल उर्फ ​​के रूप में रखा और इसे नाम दिया remigrate

अब तक, आप आसानी से "चेन" रेल कार्य कर सकते हैं:

$ rake db:drop db:create db:migrate db:schema:dump db:test:prepare # db:test:prepare no longer available since Rails 4.1.0.rc1+

12
यह एक के बाद एक आपके सभी माइग्रेशन को चलाने वाला है, जो स्केलेबल नहीं है और त्रुटि-प्रवण है। इसके अलावा, मुझे पूरा यकीन है कि डीबी: माइग्रेट अपडेट आपके स्कीमा.आरबी, इसलिए आपका स्कीमा: डंप उपयोगी कुछ भी नहीं कर रहा है।
कोरीवर्ड

तो एक डेटाबेस को कैसे खाली करता है? विकास में ... यह सब बाहर साफ।
अप्रेजिस

3
@AnApprentice आप चला सकते हैं db:reset, जो कि केवल एक Google है (या गाइड पर जांच करें )। मेरी टिप्पणी का उपयोग करने से बचने के लिए सलाह नहीं दी गई थी, लेकिन उपयोग करने से बचने के लिएdb:migrate जब आप वास्तव में चाहते हैं तो लिए db:schema:load
23

7
वैसे, @ टीके, आपको वास्तव में इन सभी को अंतिम प्रक्रिया से बाहर निकलने की स्थिति पर निर्भर अलग-अलग प्रक्रियाओं के रूप में चलाने की आवश्यकता नहीं है। इसके बजाय, बस सभी वांछित कार्यों को पास करें rake, जैसे rake db:drop db:create db:schema:load:।
कोरियरवर्ड

1
यह एक महत्वपूर्ण बात है, लेकिन मुझे कभी भी कोई समस्या नहीं हुई है db:migrate... जबकि db:schema:loadएक नए प्रवासन के साथ संस्करण नियंत्रण में स्कीमा.बीआर की जांच करने की भूल करने वाले के प्रति संवेदनशील है।
जॉनीपिल

37

अद्यतन: रेल 5 में, यह कमांड इस कमांड के माध्यम से सुलभ होगी:

rails db:purge db:create db:migrate RAILS_ENV=test


नवीनतम रेल 4.2 रिलीज के अनुसार अब आप चला सकते हैं:

rake db:purge 

स्रोत: प्रतिबद्ध

# desc "Empty the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:drop:all to drop all databases in the config). Without RAILS_ENV it defaults to purging the development and test databases."
  task :purge => [:load_config] do
    ActiveRecord::Tasks::DatabaseTasks.purge_current
  end

यह ऊपर वर्णित की तरह एक साथ इस्तेमाल किया जा सकता है:

rake db:purge db:create db:migrate RAILS_ENV=test

जैसा कि @bekicot सादे अंग्रेजी में कहता है db:purge"सभी डेटा को हटा दें लेकिन सभी तालिका और कॉलम को संरक्षित करें"
MCB

@MCB मैं गलत था, इस बारे में बहुत कुछ है, db:purge तालिकाओं को संरक्षित नहीं कर रहा है।
याना अगुन सिसवंतो

29

आप जो चाहते हैं उसके आधार पर, आप उपयोग कर सकते हैं ...

rake db:create

… से config/database.ymlया खरोंच से डेटाबेस बनाने के लिए …

rake db:schema:load

... अपनी schema.rbफ़ाइल से खरोंच से डेटाबेस बनाने के लिए ।


1
आप डेटाबेस को पहले छोड़ चुके हैं ... या आप चाहें तो तालिकाओं को हटा सकते हैं।
Coreyward

5
स्कीमा लोड के लिए +1। कभी-कभी माइग्रेशन गड़बड़ हो जाता है, लेकिन स्कीमा ऐसा होना चाहिए जिसे बरकरार रखा जाए।
डैनी

मैंने द रेल 3 वे में पढ़ा कि स्कीमा को लोड करने का तरीका है, जैसा कि सभी माइग्रेशन को चलाने के लिए है। मुझे ठीक से याद नहीं है कि उनका तर्क क्या था लेकिन यह समझ में आता है। यदि अंतिम परिणाम एक ही तरह से होता है, तो माइग्रेशन का एक गुच्छा चलाने के बजाय स्कीमा से डेटाबेस को लोड करना सरल और कम त्रुटि वाला लगता है।
जेसन स्विट

3
तर्क यह है कि माइग्रेशन डेटा को माइग्रेट करने के लिए होते हैं, और समय के साथ आपके मॉडल बदलते समय तेजी से भंगुर हो जाते हैं। जब भी आप उन्हें चलाने के लिए सुनिश्चित करने के लिए संभव हो, तो आप अपने माइग्रेशन में नंगे-न्यूनतम स्कोप किए गए मॉडल में सेंकना (और कर सकते हैं), लेकिन यह ठीक नहीं है और जो अनुप्रयोग जानता है उससे डेटाबेस बनाने की तुलना में बहुत कम कुशल है। । एक डेटाबेस बनाने के लिए माइग्रेशन पर भरोसा क्यों करें जो आपके स्कीमा जैसा दिखता है जब आप सिर्फ ब्लूप्रिंट से ही निर्माण कर सकते हैं?
कोरीवर्ड

13

कमांड लाइन रन से

rake db:migrate:reset

यह एकमात्र तरीका है जो एप्लिकेशन को फिर से सभी माइग्रेशन चलाने के लिए बनाता है। क्योंकि प्रत्येक माइग्रेशन में परिवर्तन करता है schema.rbऔर यदि आप केवल dropऔर create, migrateकुछ भी नहीं (6 पटरियों पर परीक्षण) करेंगे
शैम्पू

12

का उपयोग करें

rake db:drop db:create db:migrate db:seed

सभी एक लाइन में। यह तेजी से होता है क्योंकि पर्यावरण बार-बार पुनः लोड नहीं होता है।

डीबी: ड्रॉप - डेटाबेस को छोड़ देगा।

db: create - डेटाबेस बनाएगा (होस्ट / db / पासवर्ड config / database.yml से लिया जाएगा)

डीबी: माइग्रेट - निर्देशिका से मौजूदा माइग्रेशन चलाएगा (डीबी / माइग्रेशन /। आरबी) *।

db: बीज - निर्देशिका (db / प्रवास / seed.rb) से संभव बीज डेटा चलाएगा

मैं आमतौर पर पसंद करते हैं:

rake db:reset

एक बार में सभी करने के लिए।

चीयर्स!


1
मुझे डीबी जोड़ना पसंद है: परीक्षण: इसे तैयार करें, अच्छे उपाय के लिए। यह इस बात पर निर्भर करता है कि आप परीक्षण कर रहे हैं या नहीं।
ctc

db:reset == db:drop + db:schema:load + db:seed,db:migrate:reset == db:drop + db:create + db:migrate
एक्स-यूरी

11

बस चरणों का अनुक्रम जारी करें: डेटाबेस को छोड़ें, फिर इसे फिर से बनाएं, डेटा माइग्रेट करें, और यदि आपके पास बीज हैं, तो डेटाबेस को बोएं:

rake db:drop db:create db:migrate db:seed

चूँकि डिफ़ॉल्ट वातावरण विकास के लिए rakeहै , ऐसे में यदि आप विशिष्ट परीक्षणों में अपवाद देखते हैं, तो आपको परीक्षण के लिए db को फिर से बनाना चाहिए जैसे कि परीक्षण संसाधन:

RAILS_ENV=test rake db:drop db:create db:migrate

ज्यादातर मामलों में परीक्षण प्रक्रियाओं के दौरान परीक्षण डेटाबेस को बोया जा रहा है, इसलिए db:seedकार्य कार्रवाई को पारित करने की आवश्यकता नहीं है। अन्यथा, आप डेटाबेस तैयार करेंगे:

rake db:test:prepare

या

RAILS_ENV=test rake db:seed

साथ ही, उपयोग करने के लिए विश्राम आप में जोड़ सकते हैं काम Rakefile निम्नलिखित कोड:

namespace :db do
   task :recreate => [ :drop, :create, :migrate ] do
      if ENV[ 'RAILS_ENV' ] !~ /test|cucumber/
         Rake::Task[ 'db:seed' ].invoke
      end
   end
end

फिर जारी करें:

rake db:recreate

8

आप मैन्युअल रूप से कर सकते हैं:

rake db:drop
rake db:create
rake db:migrate

या बस rake db:reset, जो ऊपर दिए गए चरणों को चलाएगा, लेकिन आपका भी चलाएगाdb/seeds.rb फ़ाइल ।

एक अतिरिक्त बारीकियों यह है कि rake db:resetआपकी schema.rbफ़ाइल से सीधे लोड होता है जैसा कि सभी माइग्रेशन फ़ाइलों को फिर से चलाने के लिए होता है।

आप डेटा सभी मामलों में उड़ा दिया जाता है।


6

आप निम्न कमांड लाइन का उपयोग कर सकते हैं:

rake db:drop db:create db:migrate db:seed db:test:clone

4

किसी विशेष डेटाबेस को छोड़ने के लिए, आप इसे रेल कंसोल पर कर सकते हैं:

$rails console
Loading development environment
1.9.3 > ActiveRecord::Migration.drop_table(:<table_name>)
1.9.3 > exit

और फिर DB को फिर से माइग्रेट करें

$bundle exec rake db:migrate 

4

सभी डेटा को हटाने के लिए, लेकिन डेटाबेस को संरक्षित करने के लिए 4.2 रेल पर

$ bin/rake db:purge && bin/rake db:schema:load

https://github.com/rails/rails/blob/4-2-stable/activerecord/CHANGELOG.md


खैर ... बस इसे आज़माया, लेकिन यह तालिकाओं और स्तंभों को संरक्षित नहीं करता है। आपको एक db चलाना है: db: purge चलाने के बाद माइग्रेट करें। तो यह तालिकाओं और स्तंभों को संरक्षित नहीं करता है। हालाँकि यह डेटाबेस को खुद ही संरक्षित करता है इसलिए आपको db: create
Freddo

1
@Cedric आप सही हैं, db: purge टेबल को संरक्षित नहीं करता है। मैंने कोड अपडेट किया।
याना अगुन सिसवंतो

3

आप उपयोग कर सकते हैं db:reset- रन डीबी के लिए: ड्रॉप और डीबी: सेटअप या db:migrate:reset - जो डीबी चलाता है: ड्रॉप, डीबी: बनाएं और डीबी: माइग्रेट करें।

आप पर मौजूद स्कीमा का उपयोग करना चाहते हैं


2

रेल गाइड के अनुसार , इस एक लाइनर का उपयोग किया जाना चाहिए क्योंकि यह schema.rbमाइग्रेशन फ़ाइलों को एक-एक करके फिर से लोड करने के बजाय लोड करेगा :

rake db:reset

1

क्योंकि विकास में, आप हमेशा डेटाबेस को फिर से बनाना चाहेंगे, आप इस तरह से अपने कार्य / कार्य फ़ोल्डर में एक रेक कार्य को परिभाषित कर सकते हैं।

  namespace :db do
      task :all => [:environment, :drop, :create, :migrate] do
   end 
end

और टर्मिनल में आप चलेंगे

rake db:all

यह आपके डेटाबेस का पुनर्निर्माण करेगा


1

मुझे लगता है कि इस कमांड को चलाने का सबसे अच्छा तरीका है:

**rake db:reset** it does db:drop, db:setup
 rake db:setup does db:create, db:schema:load, db:seed

1

बस आप दौड़ सकते हैं

rake db:setup

अगर आप कुछ डेटा के साथ सीड फाइल बनाते हैं तो यह डेटाबेस को गिरा देगा, नया डेटाबेस बना देगा और बीज से db को पॉप्युलेट करेगा।


1

3 विकल्प, एक ही परिणाम:

1. सभी कदम:

  $ rake db:drop           # deletes the database for the current env
  $ rake db:create         # creates the database for the current env
  $ rake db:schema:load    # loads the schema already generated from schema.rb / erases data
  $ rake db:seed           # seed with initial data

2. रीसेट:

  $ rake db:reset          # drop / schema:load / seed

3. माइग्रेट करें: रीसेट करें:

  $ rake db:migrate:reset  # drop / create / migrate
  $ rake db:seed

टिप्पणियाँ:

  • यदि स्कीमा: लोड का उपयोग किया जाता है तो सभी माइग्रेशन करने की तुलना में तेज़ होता है, लेकिन समान परिणाम।
  • सारा डेटा खो जाएगा।
  • आप एक पंक्ति में कई रेक चला सकते हैं।
  • रेल के साथ काम करता है 3।

0

मैंने आज अपने रेल स्कीमा में काफी बदलाव किए हैं। मुझे एहसास हुआ कि मुझे एक पदानुक्रम में अतिरिक्त दो मॉडल और कुछ अन्य को हटाने की आवश्यकता है। मॉडल और नियंत्रकों के लिए कई छोटे बदलावों की आवश्यकता थी।

मैंने दो नए मॉडल जोड़े और उनका उपयोग करके बनाया:

rake db:migrate

फिर मैंने स्कीमा.आरबी फ़ाइल को संपादित किया। मैंने मैन्युअल रूप से पुराने मॉडलों को हटा दिया था जो अब आवश्यक नहीं थे, विदेशी कुंजी क्षेत्र को आवश्यकतानुसार बदल दिया और बस इसे मेरे लिए स्पष्ट करने के लिए इसे थोड़ा पुन: व्यवस्थित किया। मैंने सभी माइग्रेशन हटा दिए, और फिर बिल्ड को फिर से चलाया:

rake db:reset

इसने पूरी तरह से काम किया। सभी डेटा को पुनः लोड करना होगा, निश्चित रूप से। रेल का एहसास हुआ कि पलायन हटा दिया गया है और उच्च-जल चिह्न को रीसेट कर दिया गया है:

-- assume_migrated_upto_version(20121026094813, ["/Users/sean/rails/f4/db/migrate"])
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.