लारवेल में रोलबैक एक विशिष्ट प्रवासन


274

मुझे चाहिए

केवल रोलबैक करने के लिए:

Rolled back: 2015_05_15_195423_alter_table_web_directories


मै भागा

php artisan migrate:rollback, मेरे प्रवास के 3 वापस चल रहे हैं।

Rolled back: 2015_05_15_195423_alter_table_web_directories
Rolled back: 2015_05_13_135240_create_web_directories_table
Rolled back: 2015_05_13_134411_create_contacts_table

मैं हटाता हूं

मेरी web_directoriesऔर मेरी contactsमेज दोनों अनायास ही। मैं कभी नहीं चाहता कि ऐसा हो, और अगर मैं केवल उस विशिष्ट रोलबैक को रोल कर सकता हूं, तो यह आपदा कभी नहीं होगी।


53
वोट दें! बस जिस तरह से आपने यह प्रश्न लिखा है :)
स्लीक

मैं sqlpro का उपयोग कर रहा हूं, यह मुझे बैच नंबर बदलने देता है, इसलिए मैंने सिर्फ नंबर बदल दिया और सिर्फ रोलबैक किया
रोली

भविष्य के रोलबैक पर विचार करते हुए, प्रत्येक माइग्रेशन को चलाने के लिए 'php आर्टिसन माइग्रेट -स्टेप' का उपयोग करें, जो केवल एक माइग्रेशन को रोलबैक करेगा जब आप php आर्टिसन माइग्रेट चलाते हैं: रोलबैक
जेम्स

जवाबों:


165

यदि आप अपनी migrationsतालिका में देखते हैं, तो आप देखेंगे कि प्रत्येक माइग्रेशन में एक बैच नंबर होता है। इसलिए जब आप वापस रोल करते हैं, तो यह प्रत्येक माइग्रेशन को वापस रोल करता है जो पिछले बैच का हिस्सा था।

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


अच्छी सिफारिश! मैंने बैच नंबर को संपादित करने की कोशिश की, यह मुझे नहीं होने देगा। यह लॉक, और ग्रे-आउट की तरह है। मैंने कोशिश की कि मेरे मैक पर MySQL WorkBench में। उस पर कोई विचार?
साइबर 8

क्या आप जानते हैं कि जब मैंने उन्हें कॉन्फ़िगर करने का प्रयास किया तो मेरा बैच नंबर लॉक क्यों है?
साइबर 8200

2
क्वेरी द्वारा माइग्रेशन तालिका में अद्यतन बैच नंबर की तरह: अद्यतन migrationsसेट batch= 2 कहां migration= 'name_of_the_migration';
इमरान खान

3
@ImranKhan हार्ड-कोडिंग बैच संख्या को '2' करने के लिए विशेष रूप से महान नहीं है यदि आपके पास दो से अधिक बैच हैं।
मार्टिन बीन

अपने माइग्रेशन टेबल को आसानी से संपादित करने और बैच नंबर बदलने के लिए सीक्वल प्रो (केवल मैक ओएस के लिए) का उपयोग करें।
अर्सलान रामय डे

294

लारवेल 5.3+

रोलबैक एक कदम। मूल रूप से।

php artisan migrate:rollback --step=1

और यहाँ मैनुअल पेज है: डॉक्स


लारवेल 5.2 और उससे पहले

बिना किसी परेशानी के करने का कोई तरीका नहीं। विवरण के लिए, मार्टिन बीन के जवाब की जांच करें ।


1
उपयोगी नहीं है जब तक कि ओपी लारवेल के इन-डेवलपमेंट संस्करण के साथ अपने आवेदन को नहीं लिख रहा है, हालांकि।
मार्टिन बीन

4
यह एक अच्छी सुविधा होगी, लेकिन यह रोलबैक करने के लिए कौन से माइग्रेशन को निर्दिष्ट करने के लिए कार्यक्षमता याद कर रहा है । मुझे लगता है कि यह सिर्फ पिछले एक तालिका में सूचीबद्ध है? जब मैं चीजों को माइग्रेट करता हूं, तो मैं आमतौर पर वापस रोल करने की योजना नहीं बनाता हूं , इसलिए मैं जिस माइग्रेशन को रोल करना चाहता हूं, वह अंतिम माइग्रेशन नहीं है। ऐसा लगता है कि इस पर लार्वा की तरह की गेंद को गिरा दिया। किसी एकल माइग्रेशन को रोलबैक करने का एकमात्र सुरक्षित तरीका माइग्रेशन तालिका को मैन्युअल रूप से संपादित करना है जो मुझे लगता है।
स्कीट

@ SkeetsO'Reilly सहमत, पलायन बहुत अच्छी तरह से सोचा नहीं कर रहे हैं। लेकिन वे यहाँ हैं इसलिए आप शुरू से ही माइग्रेशन पैकेज देखने के लिए मजबूर नहीं होंगे।
योहानी प्रकोपचेक

इसने एक जादू की तरह काम किया। मैं एक नया माइग्रेशन विकसित कर रहा था (एक मौजूदा तालिका में एक कॉलम जोड़ रहा है), फिर मैंने देखा कि मैं "uuid" प्रकार के साथ माइग्रेट किया गया था, मैं "स्ट्रिंग" चाहता था। आपके रोलबैक टिप ने पूरी तरह से काम किया। रोलबैक। अपडेट कोड। फिर से प्रवास करें। => 100% ठीक है। लारवेल 5.7
फ्लोरियन डॉयेन

मैं (php कारीगर) कमांड लाइन द्वारा अपने अंतिम एन माइग्रेशन चरणों को कैसे प्राप्त कर सकता हूं। अगर मैं चाहता हूं, तो मैं अपने इतिहास और मेरे अंतिम प्रवास को लाने के लिए मेरी माइग्रेशन टेबल और क्वेरी को डीबी और खोज सकता हूं। लेकिन दूसरे हाथ में, मैं हमेशा अपने माइग्रेशन फ़ोल्डर का उपयोग नहीं कर सकता क्योंकि नया माइग्रेशन हमेशा सॉर्ट नहीं किया जाता है। इस समस्या के लिए मैं सिर्फ सलाह देता हूं कि हम php कारीगर बनाने का उपयोग करें: माइग्रेशन और न ही उन मौजूदा फ़ाइलों के बीच से माइग्रेशन फ़ाइलों की प्रतिलिपि का उपयोग करें।
कृपाण तबताबी यज़ीदी

27

हर बार जब आप रोलबैक करते हैं तो आपको प्रवास का अंतिम बैच मिलता है। कमांड का उपयोग करें

php artisan migrate:rollback --step=1

19

अगर आप @ मर्टिन बीन द्वारा बताई गई बातों को नहीं कर सकते, तो आप एक और तरकीब आजमा सकते हैं।

एक नया माइग्रेशन बनाएं और उस फ़ाइल में ऊपर () मेथड डालें जो नीचे है () माइग्रेशन का वह तरीका है जिसे आप रोलबैक करना चाहते हैं और नीचे () मेथड डालें कि क्या अप () मेथड है।

जैसे अगर आपका मूल माइग्रेशन इस तरह है

public function up()
{
    Schema::create('users', function(Blueprint $table)
    {
        $table->increments('id')->unsigned();
        $table->string('name');
    });
}
public function down()
{
    Schema::drop('users');
}

फिर नई माइग्रेशन फ़ाइल में ऐसा करें

public function up()
{
    Schema::drop('users');
}
public function down()
{
    Schema::create('users', function(Blueprint $table)
    {
        $table->increments('id')->unsigned();
        $table->string('name');
    });
}

और फिर माइग्रेट चलाएं, यह तालिका को हटा देगा। और यदि आप फिर से चाहते हैं कि इसे वापस रोलबैक करें।


आपके उत्तर के लिए धन्यवाद, लेकिन मैं इसके साथ पूरी तरह तैयार हूं। आपके लिए त्वरित प्रश्न, क्या आप जानते हैं कि मैं अपनी माइग्रेशन तालिका के बैच कॉलम को संपादित क्यों नहीं कर सकता?
सायबर 8200

1
@ थोड़ा देर से लेकिन यूआई का उपयोग करके आप इसे संपादित नहीं कर सकते इसका कारण यह है कि टेबल के माइग्रेशन में प्राथमिक कुंजी नहीं है। आपको इसे स्वयं संपादित करने के लिए sql लिखना होगा।
विक

बहुत ही चतुर, उसने वही किया जो मैं चाहता था
गज 17

16

बेहतर इस्तेमाल किया ताज़ा माइग्रेट

आप रिफ्रेश कमांड को स्टेप विकल्प प्रदान करके सीमित संख्या में माइग्रेशन को रोलबैक और री-माइग्रेट कर सकते हैं। उदाहरण के लिए, निम्न कमांड अंतिम दो माइग्रेशनों को रोलबैक और री-माइग्रेट करेगा:

php artisan migrate:refresh --step=2

अन्यथा रोलबैक माइग्रेट का उपयोग किया गया

आप रोलबैक कमांड को चरण विकल्प प्रदान करके सीमित संख्या में माइग्रेशन रोलबैक कर सकते हैं। उदाहरण के लिए, निम्न आदेश अंतिम तीन माइग्रेशन रोलबैक करेगा:

php artisan migrate:rollback --step=3

माइग्रेशन देखें के बारे में अधिक विस्तार के लिए


13

सबसे अच्छा तरीका है कि एक नया प्रवास बनाएं और उसमें आवश्यक परिवर्तन करें।

सबसे खराब स्थिति वर्कअराउंड ( यदि आपके पास DB प्लस तक पहुंच है तो आप उस तालिका के डेटा के एक परिणाम के साथ ठीक हैं ):

  1. DB पर जाएं और माइग्रेशन प्रविष्टि को हटाने / नाम बदलेंyour-specific-migration
  2. ड्रॉप द्वारा बनाई गई तालिकाyour-specific-migration
  3. Daud php artisan migrate --path=/database/migrations/your-specific-migration.php

यह लार्वा को उस विशिष्ट माइग्रेशन को चलाने के लिए मजबूर करेगा क्योंकि लारवेल के माइग्रेशन इतिहास में इसके बारे में कोई प्रविष्टि मौजूद नहीं है

अद्यतन : लारवेल रास्ता (धन्यवाद, @ थियागो-वालेंटे)

Daud:

php artisan migrate:rollback --path=/database/migrations/your-specific-migration.php

और फिर:

php artisan migrate

यह उस विशेष माइग्रेशन को फिर से चलाएगा


4
मैं का उपयोग किया है php artisan migrate:rollback --path=/database/migrations/your-specific-migration.phpऔर अंत में php artisan migrate
थियागो वैलेंटाइन

8

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

अपना माइग्रेशन बनाने से पहले विभिन्न निर्देशिकाएं बनाएं जैसे:

    database
       | 
       migrations
            |
            batch_1
            batch_2
            batch_3

फिर, जब आपका माइग्रेशन बनाते हैं तो निम्न कमांड चलाते हैं (उदाहरण के रूप में अपनी तालिकाओं का उपयोग करते हुए):

     php artisan make:migration alter_table_web_directories --path=database/migrations/batch_1

या

     php artisan make:migration alter_table_web_directories --path=database/migrations/batch_2

या

     php artisan make:migration alter_table_web_directories --path=database/migrations/batch_3

ऊपर दिए गए आदेश दिए गए निर्देशिका पथ के भीतर माइग्रेशन फ़ाइल बनाएंगे। तब आप अपनी निर्दिष्ट निर्देशिकाओं के माध्यम से अपनी फ़ाइलों को स्थानांतरित करने के लिए बस निम्नलिखित कमांड चला सकते हैं।

    php artisan migrate alter_table_web_directories --path=database/migrations/batch_1

* नोट: आप बैच_1 को बैच 2 में बदल सकते हैं या बैच_3 या जो भी फ़ोल्डर नाम आप माइग्रेशन फ़ाइलों को स्टोर कर रहे हैं। जब तक यह डेटाबेस / माइग्रेशन डायरेक्टरी या कुछ निर्दिष्ट डायरेक्टरी के भीतर रहता है।

अगला यदि आपको अपने विशिष्ट माइग्रेशन को रोलबैक करना है तो आप नीचे दिखाए अनुसार बैच द्वारा रोलबैक कर सकते हैं:

    php artisan migrate:rollback --step=1
                    or try
php artisan migrate:rollback alter_table_web_directories --path=database/migrations/batch_1

या

    php artisan migrate:rollback --step=2
                    or try
php artisan migrate:rollback alter_table_web_directories --path=database/migrations/batch_2

या

    php artisan migrate:rollback --step=3
                    or try
php artisan migrate:rollback alter_table_web_directories --path=database/migrations/batch_3

इन तकनीकों का उपयोग करने से आप अपने डेटाबेस और आपके स्कीमा में किए गए किसी भी संशोधन पर अधिक लचीलापन और नियंत्रण कर सकते हैं।


जब तक लार्वा प्रलेखन गलत नहीं होता है, "--step = 3" का अर्थ है कि यह अंतिम 3 माइग्रेशन को रोलबैक करेगा , कि 3 से अंतिम माइग्रेशन रन। मुझे नहीं पता कि अलग-अलग फ़ोल्डरों में माइग्रेशन डालने से वह बिल्कुल बदल जाएगा, लेकिन मैं इसकी उम्मीद नहीं करूंगा। यदि नाम से रोलबैक को निर्दिष्ट करना काम करता है, तो यह बहुत अच्छा होगा! यदि आप रोलबैक को कोई तर्क देते हैं, हालांकि, यह "बहुत सारे तर्क" की शिकायत करता है।
स्कीट

5

यदि आप अंतिम माइग्रेशन को रोलबैक करना चाहते हैं।

php artisan migrate:rollback

यदि आप विशिष्ट माइग्रेशन को रोलबैक करना चाहते हैं तो माइग्रेशन टेबल पर जाएं और उस रिकॉर्ड का उच्चतम मान बैच में सेट करें। फिर।

php artisan migrate:rollback

वर्तमान में मैं लार्वा 5.8 पर काम कर रहा हूं यदि लार्वा के किसी अन्य संस्करण पर काम नहीं किया जा रहा है तो कृपया मुझे सूचित करें।


1
मेरे लिए उपयोगी था। अंतिम प्रवास के साथ वास्तव में ऐसा मामला।
कोडटॉइल

4

एक-एक करके टेबल्स माइग्रेट करें।

उस माइग्रेशन की बैच संख्या बदलें, जिसे आप सर्वाधिक रोलबैक करना चाहते हैं।

माइग्रेट रन करें: रोलबैक।

बड़ी परियोजनाओं से निपटने का सबसे आरामदायक तरीका नहीं हो सकता है।


4

रोलबैक एक कदम। मूल रूप से।

php artisan migrate:rollback --step=1

रोलबैक दो चरण। मूल रूप से।

php artisan migrate:rollback --step=2


3

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

सबसे पहले, अपने Laravel प्रोजेक्ट में पैकेज स्थापित करें:

composer require caloskao/migrate-specific

इस पर कमांड रजिस्टर करें app/Console/Kernel.php:

protected $commands = [
    \CalosKao\MigrateSpecific::class
];

अब, अपनी फाइल को माइग्रेट करने के लिए इस कमांड को रन करें

php artisan migrate:specific database/migrations/table.php

इसका उपयोग करके प्राप्त किया जा सकता है php artisan:migrate --path=database/migrations/my_migration.php। इससे पहले कि आप करते हैं, सुनिश्चित करें कि migrationsतालिका के लिए कोई प्रविष्टि नहीं है my_migration
अलेक्जेंडर

1
INSERT INTO homestead.bb_migrations (`migration`, `batch`)  VALUES ('2016_01_21_064436_create_victory_point_balance_table', '2')

कुछ इस तरह


1

1.) डेटाबेस के अंदर, माइग्रेशन टेबल पर जाएं और उस टेबल से संबंधित माइग्रेशन की प्रविष्टि को हटा दें जिसे आप ड्रॉप करना चाहते हैं।

प्रवासन तालिका छवि उदाहरण

2.) अगला, आप केवल निर्देश 1 से हटाए गए माइग्रेशन से संबंधित तालिका हटाएं।

तालिका छवि उदाहरण हटाएं

3.) अंत में, वह परिवर्तन करें जिसे आप निर्देश संख्‍या से हटाए गए तालिका की माइग्रेशन फ़ाइल में करना चाहते हैं। 2 इसके बाद php artisan migrateटेबल को फिर से माइग्रेट करने के लिए दौड़ें ।


0

जैसा कि लारवेल मैनुअल में कहा गया है , आप --stepविकल्प का उपयोग करके विशिष्ट संख्या में माइग्रेशन रोल कर सकते हैं

php artisan migrate:rollback --step=5

केवल लारवेल 5.3, इसलिए उस संस्करण के नीचे कोडित कुछ भी इसका उपयोग नहीं कर सकता है
जेफ़ेज़

यह ओपी के मामले में मदद नहीं करेगा, क्योंकि यह एक निश्चित संख्या में माइग्रेशन रोलबैक करेगा, न कि एक निर्दिष्ट माइग्रेशन। "--step3" अभी भी सभी 3 माइग्रेशन रोलबैक करेगा।
स्कीप्स

0

उन लोगों के लिए एक और विकल्प यदि आपको एक ही माइग्रेशन (ओं) के साथ कई बार ऐसा करने की आवश्यकता है। व्यक्तिगत रूप से मुझे लगता है कि यह आपके माइग्रेशन में बहुत अधिक लचीलापन जोड़ता है।

database/migrationsअपने ऑटोलैड ऑब्जेक्ट को composer.jsonइस तरह से जोड़ें :

"autoload": {
        "psr-4": {
            "App\\": "app/"
        },
        "classmap": [
            "database/seeds",
            "database/factories",
            "database/support",
            "database/migrations" // add this line
        ]
    },

फिर namespace Database\Migrations;अपनी सभी माइग्रेशन फ़ाइलों में जोड़ें।

फिर $ composer dump-autoloadअपनी composer.lockफ़ाइल को ताज़ा करने के लिए चलाएँ ।

फिर, माइग्रेशन के लिए अपने वर्ग का नाम मानते हुए AlterTableWebDirectories, आप इस तरह से एक कमांड बना सकते हैं:

$ php artisan make:command DropAlterTableWebDirectories

और इस तर्क को अपनी handle()विधि में लिखें :

public function handle {
   (new AlterTableWebDirectories)->down();
   DB::raw("delete from migrations where migration like '%alter_table_web_directories%'");
}

यह वही करेगा जो आप चाहते हैं। यदि आप इसे हटाने के बजाय माइग्रेशन गणना को कम करना चाहते हैं, तो आप संभवतः यह पता लगा सकते हैं कि DB:rawकमांड को कैसे बदलना है ।

यह कमांड आपको डायनामिक रूप से यह चुनने के लिए दिया जा सकता है कि कमांड में एक तर्क पास करके आप कौन से माइग्रेशन को छोड़ रहे हैं।

फिर जब आप उस फ़ाइल को फिर से माइग्रेट करने के लिए पढ़ रहे हैं, तो आप बस चला सकते हैं php artisan migrateऔर यह केवल उस एक को माइग्रेट करेगा।

यह प्रक्रिया आपको हर बार पूर्ण रिफ्रेश और सीड करने के बिना माइग्रेशन में विशिष्ट बदलाव करने की अनुमति देती है।

व्यक्तिगत रूप से मुझे ऐसा करने की आवश्यकता है क्योंकि मेरे बीज बड़े हैं।


0
php artisan migrate:rollback --path=/database/migrations/0000_00_00_0000_create_something_table.php

0

यदि आपके पास डीबी तक पहुंच है, तो आपके पास एक आसान समाधान है। आप माइग्रेशन टेबल से रिकॉर्ड हटा सकते हैं और फिर टेबल को हटा सकते हैं । SQL क्लाइंट के साथ।

और उपयोग कर सकते हैं

php artisan migrate:rollback --path=... 

जैसे कई जवाब। और याद रखना पथ स्थान है। आप इस तरह भी मॉड्यूल प्रवास को हटा सकते हैं। (कहीं से भी कोई पलायन)

php artisan migrate:rollback --path=Modules/YourModule/database/migrations/2020_05_15_xxxxxx_create_your_table.php

और याद रखें, यदि आप केस सेंसिटिविटी के बारे में सावधानी से लिनक्स सर्वर का उपयोग कर रहे हैं। आपको शुरुआती पूंजी के साथ / डेटाबेस / माइग्रेशन जोड़ना होगा ।

/Database/Migrations/2020_05_15_xxxxxx_create_your_table.php

0

केवल एक विशिष्ट प्रवासन को वापस रोल करना काफी आसान है।
कमांड के बाद से php artisan migrate:rollback, पिछले डेटाबेस माइग्रेशन को पूर्ववत करें, और माइग्रेशन निष्पादन का क्रम तालिका batchमें फ़ील्ड में संग्रहीत किया जाता है migrations

आप उस माइग्रेशन के बैच मान को संपादित कर सकते हैं जिसे आप रोलबैक करना चाहते हैं और इसे उच्चतर के रूप में सेट करें। फिर आप उस माइग्रेशन को एक साधारण से रोलबैक कर सकते हैं:

php artisan migrate:rollback

एक ही माइग्रेशन को संपादित करने के बाद आप इसे एक साधारण से फिर से निष्पादित कर सकते हैं

php artisan migrate

सूचना: यदि दो या अधिक माइग्रेशन का समान मूल्य है, तो वे सभी एक ही समय में वापस आ जाएंगे।

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