केवल एक प्रवास रेक


94

मैं अपने रेल एप्लिकेशन में पूरे गुच्छा से केवल एक माइग्रेशन चलाने की कोशिश कर रहा हूं। मैं यह कैसे कर सकता हूँ? मैं इसके पहले या बाद में कोई भी माइग्रेशन नहीं चलाना चाहता। धन्यवाद।


1
यह एक सुविधाजनक रेल सुविधा होगी: इसमें एक STEP=nतर्क जोड़ें db:migrate(जहां nचलाने के लिए पलायन की संख्या है, जैसे वहां के लिए है db:rollback) - तो आप कर सकते हैं rake db:migrate STEP=1या rake db:migrate STEP=2आदि
user664833

जवाबों:


164

rake db:migrate:redo VERSION=xxxxxxx, लेकिन यह कदम downऔर फिर चलेगा up। आप अस्थायी रूप से डाउन स्टेप पर टिप्पणी करने के साथ ऐसा कर सकते हैं।


हम्म, blog.stonean.com/2007/12/18/rake-dbmigrateredo , :: redo एक VERSION तर्क नहीं लगता है।
टेरी जी लॉर्बर

3
@pedrorolo: यह पुराना नहीं है। इस कार्य का कोई वर्णन नहीं है और इसलिए यह इसमें दिखाई नहीं देगा rake -T
रयान बिग बिग

1
@pedrorolo: db:test:prepareभी उस सूची में दिखाई नहीं देता है। भगवान मुझे पार्टी के लिए देर हो रही है।
मैराक्रोंज़

9
रयान जो कहता है, उस पर विस्तार करने के लिए, यदि तालिका को डेटाबेस से बाहर रखा गया है, rake db:migrate:up VERSION=my_versionतो रेल्स कुछ भी नहीं कर सकते हैं , क्योंकि स्कीमा_मिग्रेशन टेबल अभी भी कहता है कि इसे चलाया गया है। उसी स्थिति में विफलrake db:migrate:redo VERSION=my_version हो सकता है क्योंकि यह तालिका को नहीं गिरा सकता है। इस मामले में, बाहर टिप्पणी downप्रवास अस्थायी रूप से विधि और फिर से रनrake db:migrate:redo...
सिंह

3
और @Leo का विस्तार करने के लिए, यदि माइग्रेशन को डिफ परिवर्तन के साथ परिभाषित किया गया है, तो इसे उपरोक्त के अलावा self.up को बदलने के लिए बदलें।
वल

70
rake db:migrate:up VERSION=1234567890

इसी तरह rake db:migrate:downएक विशिष्ट प्रवास को नीचे ले जाने के लिए। आप उपलब्ध रेक कार्यों की सूची प्राप्त कर सकते हैं rake -T


4
यहां VERSIONउल्लेख किया गया है कि आपकी प्रत्येक माइग्रेशन फ़ाइलों की शुरुआत में पूर्णांक मान होता है (जो कि इसे बनाते समय सिर्फ टाइमस्टैम्प था)। उदाहरण के लिए, VERSION=20150720023630
ऐरन-कोडिंग

3
संस्करणों को अच्छी तरह से रेक db के साथ प्रदर्शित किया जाता है: माइग्रेट करें: स्थिति
jpgeek

उल्लेखनीय है, VERSIONयह सिर्फ एक पर्यावरण चर है, इसलिए यह कमांड में पहली बार आ सकता है या यहां तक ​​कि कमांड में पिछले सेट कर सकता है:VERSION=1234567890 rake db:migrate:up
यहोशू Pinter

25

मुझे एक ही माइग्रेशन चलाना था जो बदल गया और अन्य सभी माइग्रेशन से स्वतंत्र रूप से फिर से चलाने की आवश्यकता थी। कंसोल फायर करें और ऐसा करें:

>> require 'db/migrate/your_migrations.rb'
=> ["YourMigrations"]
>> YourMigrations.up
=> etc... as the migration runs
>> YourMigration.down

अधिक उपयोगी यह एक रेक कार्य आदि में डाला जा सकता है।


6
यह अजीब काम किया। आप केवल क्लास को परिभाषित करने के लिए कंसोल में माइग्रेशन से कोड को कॉपी-पेस्ट कर सकते हैं (और यदि आवश्यक हो तो मैनुअल हेरफेर की अनुमति देता है, यदि आपने उदाहरण के लिए देव पर गलती की है)। यदि आपने एक प्रतिवर्ती प्रवासन को परिभाषित किया है change, तो YourMigrations.migrate(:up)इसके बजाय (या :downभी!)
चलाएं

1
आपको require "#{Rails.root}/db/migrate/your_migrations.rb"
s2t2

15

rake db:migrate:up VERSION=version_no

विशिष्ट माइग्रेशन स्क्रिप्ट को माइग्रेट (जोड़ें) करेगा

rake db:migrate:down VERSION=version_no

विशिष्ट माइग्रेशन स्क्रिप्ट हटा देगा


10
rake db:migrate VERSION=20098252345

कोशिश करो कि।


7
मुझे लगता है कि यह आपके द्वारा निर्दिष्ट किसी भी माइग्रेशन को चलाएगा।
केन लियू

1
करीब है, लेकिन यह भी विशिष्ट प्रवासन से पहले किसी भी पलायन चलाता है।
आनन

6
मुझे नहीं लगता कि आपको इससे पहले बिना विचार किए केवल एक माइग्रेशन चलाना चाहिए। एक माइग्रेशन डेटाबेस संरचना का एक प्रतिनिधित्व है क्योंकि यह एक निश्चित समय पर कोड से संबंधित होता है, और इस तरह से पहले माइग्रेशन आवश्यक होता है। यदि आप केवल एक माइग्रेशन चलाना चाहते हैं, तो संभावना है कि आपने माइग्रेशन को कार्यात्मक बनाए रखने के लिए उचित अप / डाउन ऑपरेशन नहीं लिखा था ... यह केवल आपके माइग्रेशन लिखने के लिए एक बुरी आदत है।
जेपी सिल्वाशी

1
ध्यान देने योग्य: VERSIONसिर्फ एक पर्यावरण चर है, इसलिए यह कमांड में पहली बार आ सकता है या यहां तक ​​कि कमांड में पिछले सेट कर सकता है:VERSION=20098252345 rake db:migrate
जोशुआ पिंटर

4
rake db:migrate:redo version='xxxx'   

Xxxx के आसपास उद्धरण चिह्न लगाने के लिए याद रखें, xxxx आपके प्रवास के लिए टाइमस्टैम्प (या माइग्रेशन आईडी) है।

आपके द्वारा उपयोग किए गए पिछले माइग्रेशन के लिए आप टाइमस्टैम्प (माइग्रेशन आईडी) की जांच कर सकते हैं

rake db:migrate:status    

3

ऊपर से कोर्च द्वारा जवाब पर विस्तार करना, requireमेरे लिए काम नहीं किया, लेकिन loadकिया। माइग्रेशन फ़ाइल के लिए, ठोस होने के लिए:

    class ChangeMinQuantityToRaces < ActiveRecord::Migration
      def change
        change_column :races, :min_quantity, :integer, :default => 0
      end
    end

कंसोल टाइपिंग में

    > load 'db/migrate/30130925110821_change_min_quantity_to_races.rb'
    > ChangeMinQuantityToRaces.new.change

मेरे लिए काम किया।

    > Race.new.min_quantity # => 0 

यह माणिक 1.9.3p484 (2013-11-22 संशोधन 43786) [x86_64-linux] और रेल 3.2.13 के लिए था।


2

इसमें अपना 2 this जोड़ना क्योंकि मैं इसी मुद्दे में भाग गया:

यदि आप पूरी तरह से एक नया बनाने के बिना फिर से एक माइग्रेशन चलाना चाहते हैं, तो आप निम्न कार्य कर सकते हैं:

rails dbconsole -p devdb=# delete from public.schema_migrations where version = '20150105181157';

और रेल "भूल जाएगी" कि यह 20150105181157 के लिए माइग्रेशन चला। अब जब आप डीबी चलाते हैं: माइग्रेट करें इसे फिर से चलेगा।

यह लगभग हमेशा एक बुरा विचार है। एक उदाहरण जहां यह समझ में आ सकता है कि यदि आपके पास एक विकास शाखा है और आपने अभी तक अपना माइग्रेशन नहीं किया है और विकास में कुछ चीजों को जोड़ना चाहते हैं। लेकिन फिर भी अपने माइग्रेशन को 2-तरफ़ा करना बेहतर है ताकि आप बार-बार रोलबैक कर सकें और पुनः प्रयास कर सकें।


1

कंसोल के माध्यम से माइग्रेशन क्लास चलाने का एक तरीका मिल गया है। मैं माइग्रेशन कोड पहचानने योग्य नहीं हो सकता।

हालांकि, जैसा कि टिप्पणी से संकेत मिलता है, यह क्रम में माइग्रेशन चलाने के लिए पसंद किया जाता है। उपयोग:

rake db:migrate VERSION=##########

स्क्रिप्ट / कंसोल पर माइग्रेशन में अपना कोड कॉपी और पेस्ट करें?


1

मेरे पास एक उपयोगिता विधि है जो विकास में इसे बहुत आसान बनाती है। मुझे लगता है कि यह मुझे बहुत सारे माइग्रेशन बनाने से बचने में मदद करता है - आम तौर पर मैं माइग्रेशन को संशोधित करता हूं जब तक कि उन्हें तैनात नहीं किया गया हो।

http://fullware.net/index.php/2011/05/26/easily-load-rails-migrations-for-console-execution/


0

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

यह 100% हैकिश है और मैं निश्चित रूप से उत्पादन में ऐसा करने की सिफारिश नहीं करूंगा, लेकिन यह चाल चलेगा:

  1. माइग्रेशन को स्थानांतरित करें जिसे आप इसके निर्देशिका से अस्थायी स्थान पर फिर से चलाना चाहते हैं
  2. इसी नाम से एक और माइग्रेशन जनरेट करें
  3. मूल माइग्रेशन कोड को नए उत्पन्न माइग्रेशन फ़ाइल में कॉपी / पेस्ट करें
  4. नया माइग्रेशन चलाएं
  5. नई उत्पन्न माइग्रेशन फ़ाइल हटाएं
  6. सबसे हाल का मान निकालने के लिए अपने स्कीमा माइग्रेशन संपादित करें
  7. पुरानी माइग्रेशन फ़ाइल को पुनर्स्थापित करें
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.