रेक डीबी: माइग्रेट डीबी: रीसेट और डीबी: स्कीमा: लोड के बीच अंतर


619

के बीच का अंतर rake db:migrateऔर rake db:resetमेरे सिर में बहुत स्पष्ट है। जो चीज मुझे समझ में नहीं आती है rake db:schema:loadवह पूर्व दो से कितनी अलग है।

बस यह सुनिश्चित करने के लिए कि मैं उसी पृष्ठ पर हूं:

  • rake db:migrate - वे माइग्रेशन चलाता है जो अभी तक नहीं चलाए गए हैं।
  • rake db:reset- डेटाबेस को साफ़ करता है (संभवतः एक rake db:drop+ rake db:create+ rake db:migrate) और एक ताज़ा डेटाबेस पर माइग्रेशन चलाता है।

कृपया स्पष्ट करने में मदद करें, अगर मेरी समझ गलत हो गई है।


10
rake --tasksमदद करता है?
zx1986

आपको इस ब्लॉग की जाँच करनी चाहिए। jacopretorius.net/2014/02/…
बिष्ट भट्टा

आपकी समझ rake db:migrateसही है, लेकिन आपकी समझ rake db:resetगलत है। सबसे महत्वपूर्ण जवाब, मोरित्ज़ से देखें।
मैग्ने

1
Btw, रेल 5 के रूप में, इन आदेशों के रूप में लागू किया जा सकता है rails db:migrate, rails db:reset, rails db:schema:load। देखें stackoverflow.com/questions/38403533/…
पर्पलजैकेट

जवाबों:


1303
  • db: माइग्रेट रन (सिंगल) माइग्रेशन जो अभी तक नहीं चला है।
  • db: create डेटाबेस बनाता है
  • db: drop डेटाबेस को डिलीट कर देता है
  • db: स्कीमा: लोड स्कीमा के बाद (मौजूदा) डेटाबेस के भीतर टेबल और कॉलम बनाता है

  • db: setup db: create, db: स्कीमा: लोड, db: बीज

  • db: रीसेट db: drop, db: setup करता है
  • db: migrate: रीसेट db: drop, db: create, db: migrate करता है

आमतौर पर, आप db का उपयोग करते हैं: नई माइग्रेशन फ़ाइलों के माध्यम से स्कीमा में परिवर्तन करने के बाद माइग्रेट करें (इसका अर्थ केवल तभी होता है जब डेटाबेस में पहले से ही डेटा हो)। db: स्कीमा: लोड का उपयोग तब किया जाता है जब आप अपने ऐप का एक नया उदाहरण सेटअप करते हैं।

मुझे आशा है कि वह मदद करेंगे।


रेल के लिए अद्यतन 3.2.12:

मैंने अभी स्रोत की जाँच की और निर्भरताएँ इस तरह हैं:

  • db: create वर्तमान env के लिए डेटाबेस बनाता है
  • db: create: all सभी डेटाबेस के लिए डेटाबेस बनाता है
  • db: ड्रॉप मौजूदा env के लिए डेटाबेस को ड्राप करता है
  • डीबी: ड्रॉप: सभी डेटाबेस सभी एनवी के लिए ड्रॉप करता है
  • db: माइग्रेट वर्तमान env के लिए माइग्रेशन चलाता है जो अभी तक नहीं चला है
  • डीबी: माइग्रेट: अप एक विशिष्ट प्रवास चलाता है
  • डीबी: माइग्रेट: डाउन रोल एक विशिष्ट माइग्रेशन को वापस करता है
  • db: माइग्रेट: स्थिति वर्तमान माइग्रेशन स्थिति दिखाती है
  • db: रोलबैक अंतिम माइग्रेशन को वापस रोल करता है
  • db: आगे मौजूदा स्कीमा संस्करण को अगले एक पर आगे बढ़ाता है
  • db: बीज (केवल) db / seed.rb फ़ाइल चलाता है
  • db: स्कीमा: लोड को स्कीमा को वर्तमान env के डेटाबेस में लोड करता है
  • डीबी: स्कीमा: डंप वर्तमान एनवीई के स्कीमा को डंप करता है (और साथ ही डीबी बनाने के लिए लगता है)

  • डीबी: सेटअप रन डीबी: स्कीमा: लोड, डीबी: बीज

  • डीबी: रीसेट रन डीबी: ड्रॉप डीबी: सेटअप
  • डीबी: माइग्रेट: रीडो रन (डीबी: माइग्रेट: डाउन डीबी: माइग्रेट: अप) या (डीबी: रोलबैक डीबी: माइग्रेट) निर्दिष्ट प्रवास के आधार पर
  • डीबी: माइग्रेट: रीसेट रन डीबी: ड्रॉप डीबी: डीबी बनाएं: माइग्रेट करें

अधिक जानकारी के लिए कृपया https://github.com/rails/rails/blob/v3.2.12/activerecord/lib/active_record/railties/dat डेटाबेस.rake (R3 3.2.x के लिए) और https: // github पर एक नज़र डालें .com / रेल / रेल / बूँद / v4.0.5 / activerecord / lib / active_record / Railties / database.rake (रेल 4.0.x के लिए)


16
यहाँ जवाब के साथ फाइल है :) - github.com/rails/rails/blob/master/activerecord/lib/…
cutalion

3
@cutation: db: setup निश्चित रूप से db: migrate को नहीं चलाता है, क्योंकि यह सिर्फ db सेटअप के लिए सभी माइग्रेशन को चलाने के लिए बहुत अधिक भंगुर होगा (यह स्कीमा.rb के लिए है)।
मोरिट्ज़

2
मैं db निष्पादित कर रहा हूं: रीसेट करें और यह मेरे db को सीडिंग कर रहा है। ऐसा क्यों हो सकता है?
एलेजांद्रो रिडेल

db:db:create यदि आवश्यक हो तो सेटअप भी चलता है। कम से कम रेल के रूप में 4.0.2।
दान

यदि लंबित माइग्रेशन हैं, तो rake db:migrateकॉल करते समय रेल 4 प्रदर्शन करेंगे, rake db:setupलेकिन लंबित माइग्रेशन निष्पादित नहीं करेंगे।
पूयण खोसरावी

24

TLDR

उपयोग

  • rake db:migrate यदि आप स्कीमा में परिवर्तन करना चाहते हैं
  • rake db:resetयदि आप डेटाबेस को छोड़ना चाहते हैं, तो स्कीमा को फिर से लोड करें schema.rb, और डेटाबेस को फिर से शुरू करें
  • rake db:schema:loadयदि आप स्कीमा में रीसेट डेटाबेस को उपलब्ध कराना चाहते हैं तो schema.rb(यह सभी डेटा हटा देगा)

स्पष्टीकरण

rake db:schema:loadschema.rbफ़ाइल में दिए गए अनुसार स्कीमा स्थापित करेगा । यह ऐप की एक नई स्थापना के लिए उपयोगी है क्योंकि इसमें उतना समय नहीं लगता जितना किdb:migrate

महत्वपूर्ण नोट, सर्वर पर डेटा हटाdb:schema:load देगा ।

rake db:migrateमौजूदा स्कीमा में परिवर्तन करता है। इसका स्कीमा के संस्करण बनाना पसंद है। किसी भी रूबी फ़ाइलों के लिए db:migrateदेखेंगे db/migrate/और उन माइग्रेशन को निष्पादित करेंगे जो अभी तक सबसे पुराने से शुरू नहीं हुए हैं। रेल्स को पता है कि माइग्रेशन फ़ाइलनाम की शुरुआत में टाइमस्टैम्प को देखकर कौन सी फाइल सबसे पुरानी है। db:migrateएक लाभ के साथ आता है कि डेटा को डेटाबेस में भी रखा जा सकता है। यह वास्तव में एक अच्छा अभ्यास नहीं है। rake db:seedडेटा जोड़ने के लिए इसका उपयोग बेहतर है ।

rake db:migrateकार्यों को ऊपर , नीचे आदि प्रदान करता है जो कमांड को सक्षम बनाता है rake db:rollbackऔर इसे सबसे उपयोगी कमांड बनाता है।

rake db:resetकरता है db:dropऔर db:setup
यह डेटाबेस को छोड़ देता है, इसे फिर से बनाता है, स्कीमा को लोड करता है, और बीज डेटा के साथ प्रारंभ करता है

से आदेशों की प्रासंगिकता का databases.rake


namespace :schema do
  desc 'Creates a db/schema.rb file that is portable against any DB supported by Active Record'
  task :dump => [:environment, :load_config] do
    require 'active_record/schema_dumper'
    filename = ENV['SCHEMA'] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, 'schema.rb')
    File.open(filename, "w:utf-8") do |file|
      ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
    end
    db_namespace['schema:dump'].reenable
  end

  desc 'Loads a schema.rb file into the database'
  task :load => [:environment, :load_config, :check_protected_environments] do
    ActiveRecord::Tasks::DatabaseTasks.load_schema_current(:ruby, ENV['SCHEMA'])
  end

  # desc 'Drops and recreates the database from db/schema.rb for the current environment and loads the seeds.'
  task :reset => [ 'db:drop', 'db:setup' ]

namespace :migrate do
  # desc  'Rollbacks the database one migration and re migrate up (options: STEP=x, VERSION=x).'
  task :redo => [:environment, :load_config] do
    if ENV['VERSION']
      db_namespace['migrate:down'].invoke
      db_namespace['migrate:up'].invoke
    else
      db_namespace['rollback'].invoke
      db_namespace['migrate'].invoke
    end
  end

इसलिए यदि आप db: स्कीमा: लोड: (पिछले माइग्रेशन की एक श्रृंखला से निर्मित) का उपयोग करके अपना प्रोडक्शन स्कीमा बनाते हैं, तो यह पता चलेगा कि कौन से माइग्रेशन (प्रारंभिक स्कीमा बनाने के लिए जिन लोगों ने भाग लिया था। आरबी) को भविष्य में चलाने की आवश्यकता नहीं है। DB के इनवोकेशन: माइग्रेट?
17

2

जहां तक ​​मैं समझता हूं, यह आपके डेटाबेस को छोड़ने और आपकी db/schema.rbफ़ाइल के आधार पर इसे फिर से बनाने जा रहा है । यही कारण है कि आपको यह सुनिश्चित करने की आवश्यकता है कि आपकी schema.rbफ़ाइल हमेशा अद्यतित है और संस्करण नियंत्रण में है।


0

आप बस सक्रिय रिकॉर्ड रेक कार्यों में देख सकते हैं क्योंकि मुझे विश्वास है कि वे इस फ़ाइल में रहते हैं। https://github.com/rails/rails/blob/fe1f4b2ad56f010a4e9b93d547d63a15953d9dc2/activerecord/lib/active_record/tasks/database_tasks.rb

वे क्या करते हैं आपका प्रश्न सही है?

यह इस बात पर निर्भर करता है कि वे कहाँ से आते हैं और यह सिर्फ और केवल यह दिखाने के लिए उदाहरण है कि वे कार्य के आधार पर भिन्न होते हैं। यहां हमारे पास कार्यों से भरा एक अलग फ़ाइल है।

https://github.com/rails/rails/blob/fe1f4b2ad56f010a4e9b93d547d63a15953d9dc2/activerecord/Rakefile

जिसके पास ये कार्य हैं।

namespace :db do
  task create: ["db:mysql:build", "db:postgresql:build"]
  task drop: ["db:mysql:drop", "db:postgresql:drop"]
end

यह आपके प्रश्न का उत्तर नहीं दे सकता है लेकिन आपको आगे बढ़ने में कुछ अंतर्दृष्टि दे सकता है और विशेष रूप से रेक फ़ाइलों और कार्यों पर स्रोत को देख सकता है। के रूप में वे मदद का एक बहुत अच्छा काम आप रेल का उपयोग करें वे हमेशा कोड है कि अच्छी तरह से दस्तावेज़ नहीं है। हम सब वहाँ मदद कर सकते हैं अगर हम जानते हैं कि यह क्या करना है।


यदि यह हटा दिया जाता है तो कृपया लेख के प्रासंगिक भागों को उद्धृत करें। क्यों समझाए बिना कुछ करने का सुझाव न दें।
फिल्ट

0

पटरियों के लिए अद्यतन 5:

db:create- वर्तमान RIDS_ENV वातावरण के लिए डेटाबेस बनाता है। यदि RIDS_ENV निर्दिष्ट नहीं है, तो यह विकास और परीक्षण डेटाबेस के लिए चूक है।

db:create:all - सभी वातावरण के लिए डेटाबेस बनाता है।

db:drop- वर्तमान RIDS_ENV वातावरण के लिए डेटाबेस को गिराता है। यदि RIDS_ENV निर्दिष्ट नहीं है, तो यह विकास और परीक्षण डेटाबेस के लिए चूक है।

db:drop:all - सभी वातावरण के लिए डेटाबेस ड्रॉप।

db:migrate- वर्तमान परिवेश के लिए माइग्रेशन चलाता है जो अभी तक नहीं चला है। डिफ़ॉल्ट रूप से यह केवल विकास के वातावरण में माइग्रेशन चलाएगा।

db:migrate:redo- रन डीबी: माइग्रेट: डाउन और डीबी: माइग्रेट: अप या डीबी: माइग्रेट: रोलबैक और डीबी: माइग्रेट: निर्दिष्ट माइग्रेशन के आधार पर।

db:migrate:up - दिए गए माइग्रेशन संस्करण के लिए अप रन करता है।

db:migrate:down - दिए गए माइग्रेशन संस्करण के लिए नीचे चलाता है।

db:migrate:status - वर्तमान माइग्रेशन स्थिति प्रदर्शित करता है।

db:migrate:rollback - अंतिम माइग्रेशन को वापस रोल करता है।

db:version - वर्तमान स्कीमा संस्करण को प्रिंट करता है।

db:forward - स्कीमा को अगले वर्जन पर पुश करता है।

db:seed- db / seeds.rb फ़ाइल चलाता है ।

db:schema:loadस्कीमा से डेटाबेस को पुनः बनाता है।

db:schema:dumpDb / schema.rb के लिए वर्तमान वातावरण के स्कीमा को डंप करता है ।

db:structure:load- structure.sql फ़ाइल से डेटाबेस को फिर से बनाता है ।

db:structure:dump- db / structure.sql के लिए वर्तमान वातावरण के स्कीम को डंप करता है । (आप के साथ एक और फ़ाइल निर्दिष्ट कर सकते हैं SCHEMA=db/my_structure.sql)

db:setupरन db: create , db: स्कीमा: लोड और db: बीज

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

db:test:prepare- लंबित माइग्रेशन की जाँच करें और परीक्षण स्कीमा को लोड करें। (यदि आप बिना किसी तर्क के रेक चलाते हैं, तो यह डिफ़ॉल्ट रूप से चलेगा।)

db:test:clone - वर्तमान वातावरण के डेटाबेस स्कीमा से परीक्षण डेटाबेस को फिर से बनाएँ।

db:test:clone_structure- db: test: क्लोन के समान , लेकिन यह सुनिश्चित करेगा कि आपके परीक्षण डेटाबेस में चारसेट और कोलाज सहित समान संरचना हो, जैसा कि आपके वर्तमान परिवेश का डेटाबेस है।

db:environment:set- वर्तमान सेट RAILS_ENV में पर्यावरण ar_internal_metadata तालिका। (संरक्षित पर्यावरण जांच के हिस्से के रूप में प्रयुक्त।)

db:check_protected_environments- जाँच करता है कि क्या वर्तमान RIDS_ENV वातावरण में एक विनाशकारी कार्रवाई की जा सकती है। आंतरिक रूप से उपयोग किया जाता है जब विध्वंसक कार्रवाई जैसे डीबी: ड्रॉप या डीबी: स्कीमा: लोड

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