ย้อนกลับการโยกย้ายหนึ่งใน Laravel


238

ฉันต้องการ

เพื่อย้อนกลับเท่านั้น:

Rolled back: 2015_05_15_195423_alter_table_web_directories


ฉันวิ่ง

php artisan migrate:rollback3 การโยกย้ายของฉันย้อนกลับ

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โต๊ะของฉันโดยไม่ได้ตั้งใจ ฉันไม่เคยต้องการที่จะเกิดขึ้นและถ้าฉันสามารถย้อนกลับเฉพาะหนึ่งที่ภัยพิบัตินี้จะไม่เกิดขึ้น


46
upvote! เพียงแค่หาวิธีที่คุณเขียนคำถามนี้ :)
Sliq

ฉันกำลังใช้ sqlpro ฉันจะเปลี่ยนหมายเลขแบทช์ดังนั้นฉันแค่เปลี่ยนหมายเลขและย้อนกลับ
roll

พิจารณาการย้อนกลับในอนาคตใช้ 'php artisan migrate --step' เพื่อเรียกใช้การย้ายข้อมูลทีละขั้นตอนซึ่งจะย้อนการโยกย้ายครั้งเดียวเมื่อคุณเรียกใช้การโยกย้าย php artisan: rollback
James

คำตอบ:


146

หากคุณดูในmigrationsตารางของคุณคุณจะเห็นว่าการย้ายข้อมูลแต่ละครั้งมีหมายเลขแบทช์ ดังนั้นเมื่อคุณย้อนกลับมันจะย้อนการโยกย้ายแต่ละครั้งที่เป็นส่วนหนึ่งของชุดสุดท้าย

ถ้าคุณต้องการย้อนกลับการโยกย้ายครั้งล่าสุดจากนั้นเพิ่มหมายเลขชุดงานทีละหนึ่ง จากนั้นในครั้งต่อไปที่คุณเรียกใช้rollbackคำสั่งคำสั่งจะย้อนกลับไปหนึ่งการย้ายข้อมูลเนื่องจากอยู่ใน“ แบทช์” ของมันเอง


คำแนะนำที่ดี! ฉันพยายามแก้ไขหมายเลขแบทช์มันจะไม่ให้ฉัน มันเป็นล็อคและเป็นสีเทา ฉันลองใน MySQL WorkBench บน Mac ของฉัน มีความคิดอะไรเกี่ยวกับเรื่องนี้?
cyber8200

คุณรู้หรือไม่ว่าทำไมหมายเลขชุดของฉันถูกล็อคเมื่อฉันพยายามที่จะกำหนดค่าพวกเขา?
cyber8200

1
อัปเดตหมายเลขแบตช์ในตารางการย้ายข้อมูลโดยใช้คำสั่งเช่น: UPDATE migrationsSET batch= 2 WHERE migration= 'name_of_the_migration';
Imran Khan

3
@ImranKhan การเข้ารหัสหมายเลขชุดเป็น '2' นั้นไม่ค่อยดีนักหากคุณมีแบตช์มากกว่าสองชุด
Martin Bean

ใช้ Sequel Pro (สำหรับ Mac OS เท่านั้น) เพื่อแก้ไขตาราง Migrations ของคุณและเปลี่ยนหมายเลขแบทช์ได้อย่างง่ายดาย
Arslan Ramay

271

Laravel 5.3+

ย้อนกลับหนึ่งขั้นตอน โดยกำเนิด

php artisan migrate:rollback --step=1

และนี่คือหน้าคู่มือ: เอกสาร


Laravel 5.2 และก่อนหน้า

ไม่มีทางที่จะทำโดยไม่ยุ่งยาก สำหรับรายละเอียดการตรวจสอบมาร์ตินบีนคำตอบ


1
ไม่มีประโยชน์เว้นแต่ OP ได้เขียนแอปพลิเคชันของเขากับ Laravel เวอร์ชันที่กำลังพัฒนา
Martin Bean

4
นี้จะเป็นคุณลักษณะที่ดี แต่มันหายไปการทำงานในการระบุที่ของการโยกย้ายที่จะย้อนกลับ ฉันถือว่าเป็นรายการล่าสุดในตารางการย้ายข้อมูลหรือไม่ เมื่อฉันย้ายสิ่งต่าง ๆ ฉันมักจะไม่วางแผนที่จะย้อนกลับดังนั้นโอกาสในการโยกย้ายที่ฉันต้องการย้อนกลับเนื่องจากการโยกย้ายครั้งสุดท้ายไม่สูงมาก ดูเหมือนว่าลูก laravel จะโยนลูกบอลลงไป วิธีเดียวที่ปลอดภัยในการย้อนการโยกย้ายครั้งเดียวคือการแก้ไขตารางการย้ายข้อมูลด้วยตนเองฉันคิดว่า
Skeets

@ SkeetsO'Reilly เห็นด้วยว่าการย้ายข้อมูลไม่ได้คิดมากนัก แต่พวกเขาอยู่ที่นี่ดังนั้นคุณจะไม่ถูกบังคับให้มองหาแพ็คเกจการโยกย้ายตั้งแต่ต้น
Yauheni Prakopchyk

มันทำงานเหมือนจับใจ ฉันกำลังพัฒนาการย้ายข้อมูลใหม่ (เพิ่มคอลัมน์ในตารางที่มีอยู่) จากนั้นฉันเห็นว่าฉันย้ายข้อมูลด้วยประเภท "uuid" ฉันต้องการ "สตริง" เคล็ดลับการย้อนกลับของคุณทำงานอย่างสมบูรณ์ ย้อนกลับ อัปเดตรหัส โยกย้ายอีกครั้ง => 100% ตกลง Laravel 5.7
Florian Doyen

ฉันจะเรียกขั้นตอนการย้ายข้อมูล N ล่าสุดโดยบรรทัดคำสั่ง (php artisan) ได้อย่างไร หากฉันต้องการฉันสามารถหาฐานข้อมูลและค้นหาตารางการย้ายข้อมูลและแบบสอบถามเพื่อดึงข้อมูลประวัติและการย้ายข้อมูลครั้งล่าสุดของฉันที่ทำงาน แต่ในอีกแง่หนึ่งฉันไม่สามารถใช้โฟลเดอร์การโยกย้ายของฉันได้เสมอเพราะการโยกย้ายใหม่ไม่ได้เรียงลำดับเสมอ สำหรับปัญหานี้ฉันขอแนะนำให้เราใช้ php artisan make: migration และอย่าใช้สำเนาของไฟล์การโอนย้ายจากตรงกลางของไฟล์ที่มีอยู่
saber tabatabaee yazdi

24

ทุกครั้งที่คุณย้อนกลับคุณจะได้รับชุดการย้ายข้อมูลครั้งล่าสุด ใช้คำสั่ง

php artisan migrate:rollback --step=1

18

หากคุณไม่สามารถทำสิ่งที่ @Martin Bean บอกได้คุณสามารถลองใช้เคล็ดลับอื่นได้

สร้างการย้ายข้อมูลใหม่และในไฟล์ up () วิธีการแทรกสิ่งที่ลง () วิธีการย้ายข้อมูลที่คุณต้องการย้อนกลับและลง () วิธีแทรกสิ่งที่อยู่ใน ()

เช่นถ้าการย้ายถิ่นดั้งเดิมของคุณเป็นเช่นนี้

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');
    });
}

แล้วเรียกใช้การโยกย้ายมันจะลบตาราง และถ้าคุณต้องการมันอีกครั้งก็แค่ย้อนกลับ


ขอบคุณสำหรับคำตอบของคุณ แต่ฉันพร้อมแล้วสำหรับสิ่งนี้ คำถามด่วนสำหรับคุณคุณรู้ไหมว่าทำไมฉันไม่สามารถแก้ไขคอลัมน์ชุดงานของตารางการย้ายข้อมูลได้
cyber8200

1
@ มันสายเล็กน้อย แต่เหตุผลที่คุณไม่สามารถแก้ไขได้โดยใช้ UI ก็คือการย้ายข้อมูลในตารางไม่มีคีย์หลัก คุณต้องเขียน sql เพื่อแก้ไขด้วยตัวคุณเอง
Vic

15

ดีกว่าที่จะใช้การโยกย้ายรีเฟรช

คุณสามารถย้อนกลับ & โยกย้ายการโยกย้ายในจำนวนที่ จำกัด โดยการให้ตัวเลือกขั้นตอนในคำสั่งรีเฟรช ตัวอย่างเช่นคำสั่งต่อไปนี้จะย้อนกลับ & โอนย้ายการย้ายข้อมูลสองครั้งล่าสุด:

php artisan migrate:refresh --step=2

มิฉะนั้นจะใช้การย้อนกลับโยกย้าย

คุณสามารถย้อนกลับจำนวนการโยกย้ายที่ จำกัด โดยการให้ตัวเลือกขั้นตอนในคำสั่งย้อนกลับ ตัวอย่างเช่นคำสั่งต่อไปนี้จะย้อนการโยกย้ายสามครั้งล่าสุด:

php artisan migrate:rollback --step=3

สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับการโยกย้ายดู


11

วิธีที่ดีที่สุดคือสร้างการย้ายข้อมูลใหม่และทำการเปลี่ยนแปลงที่จำเป็น

วิธีแก้ปัญหากรณีที่เลวร้ายที่สุด ( ถ้าคุณสามารถเข้าถึง DB plus คุณก็โอเคกับการรีเซ็ตข้อมูลของตารางนั้น ):

  1. ไปที่ DB และลบ / เปลี่ยนชื่อรายการการโยกย้ายyour-specific-migration
  2. วางตารางที่สร้างโดยyour-specific-migration
  3. วิ่ง php artisan migrate --path=/database/migrations/your-specific-migration.php

สิ่งนี้จะบังคับให้ laravel เรียกใช้การย้ายถิ่นเฉพาะนั้นโดยที่ไม่มีข้อมูลเกี่ยวกับเรื่องนี้ในประวัติการย้ายถิ่นของ Laravel

อัปเดต : วิธี Laravel (ขอบคุณ @ thiago-valente)

วิ่ง:

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
Thiago Valente

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

* หมายเหตุ: คุณสามารถเปลี่ยน batch_1 เป็น batch_2 หรือ batch_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

การใช้เทคนิคเหล่านี้จะช่วยให้คุณมีความยืดหยุ่นมากขึ้นและควบคุมฐานข้อมูลของคุณและการแก้ไขใด ๆ ที่ทำกับสคีมาของคุณ


เว้นแต่ว่าเอกสาร laravel ไม่ถูกต้อง "--step = 3" หมายความว่ามันจะย้อนการโยกย้าย3 ครั้งล่าสุดไม่ใช่การโยกย้ายครั้งที่ 3 ถึงครั้งสุดท้าย ฉันไม่ทราบว่าการย้ายข้อมูลไปยังโฟลเดอร์อื่นจะเปลี่ยนสิ่งนั้นหรือไม่ แต่ฉันไม่คิดว่ามันจะเป็นเช่นนั้น หากระบุการย้อนกลับด้วยชื่อผลงานจะดีมาก! หากคุณให้ข้อโต้แย้งใด ๆ ย้อนกลับมันบ่น "ข้อโต้แย้งมากเกินไป"
Skeets

4

ย้อนกลับหนึ่งขั้นตอน โดยกำเนิด

php artisan migrate:rollback --step=1

ย้อนกลับสองขั้นตอน โดยกำเนิด

php artisan migrate:rollback --step=2


4

หากคุณต้องการย้อนกลับการโยกย้ายครั้งล่าสุด

php artisan migrate:rollback

หากคุณต้องการย้อนกลับการโยกย้ายที่เฉพาะเจาะจงไปที่ตารางการโยกย้ายและตั้งค่าสูงสุดของบันทึกในชุด แล้วก็

php artisan migrate:rollback

ขณะนี้ฉันกำลังทำงานกับ laravel 5.8 หากไม่ได้ทำงาน laravel รุ่นอื่นโปรดแจ้งให้ฉันทราบ


มีประโยชน์สำหรับฉัน กรณีดังกล่าวด้วยการโยกย้ายครั้งสุดท้าย
CodeToLife

3

โอนย้ายตารางทีละหนึ่ง

เปลี่ยนหมายเลขแบทช์ของการย้ายข้อมูลที่คุณต้องการย้อนกลับเป็นสูงสุด

เรียกใช้การโยกย้าย: ย้อนกลับ

อาจไม่ใช่วิธีที่สะดวกสบายที่สุดในการจัดการกับโครงการขนาดใหญ่


3

หากคุณต้องการแก้ไขไฟล์การโยกย้ายดั้งเดิมและโอนย้ายอีกครั้งคุณสามารถใช้แพ็คเกจนี้เพื่อโอนย้าย (ใช้ได้กับLaravel 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
Aleksandar


1

1. ) ภายในฐานข้อมูลมุ่งหน้าไปยังตารางการย้ายข้อมูลและลบรายการการย้ายข้อมูลที่เกี่ยวข้องกับตารางที่คุณต้องการวาง

ตัวอย่างรูปภาพตารางการย้ายข้อมูล

2. ) ถัดไปลบตารางที่เกี่ยวข้องกับการย้ายข้อมูลที่คุณเพิ่งลบจากคำสั่ง 1

ลบตัวอย่างภาพตาราง

3. ) ในที่สุดให้ทำการเปลี่ยนแปลงที่คุณต้องการกับไฟล์การโยกย้ายของตารางที่คุณลบออกจากหมายเลขคำสั่ง 2 จากนั้นเรียกใช้php artisan migrateเพื่อย้ายข้อมูลตารางอีกครั้ง


0

ตามที่ระบุไว้ในคู่มือ Laravelคุณสามารถย้อนกลับจำนวนการย้ายข้อมูลเฉพาะโดยใช้--stepตัวเลือก

php artisan migrate:rollback --step=5

Laravel 5.3 เท่านั้นดังนั้นสิ่งใดก็ตามที่เขียนด้านล่างเวอร์ชันนั้นไม่สามารถใช้งานได้
Jeffz

สิ่งนี้จะไม่ช่วยในกรณีของ OP เนื่องจากจะย้อนการโยกย้ายจำนวนหนึ่งไม่ใช่การย้ายที่ระบุเพียงครั้งเดียว "--step3" จะยังคงย้อนการโยกย้ายทั้ง 3 รายการ
Skeets

0

ทางเลือกอื่นสำหรับสิ่งที่กล่าวถึงหากคุณต้องการทำสิ่งนี้หลายครั้งด้วยการโยกย้ายเดียวกัน โดยส่วนตัวแล้วฉันคิดว่านี่เป็นการเพิ่มความยืดหยุ่นให้กับการย้ายข้อมูลของคุณ

เพิ่มdatabase/migrationsไปยังวัตถุ autoload ของคุณใน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

หากคุณมีสิทธิ์เข้าถึงฐานข้อมูลคุณมีวิธีแก้ไขปัญหาที่ง่ายกว่า คุณสามารถลบบันทึกจากตารางการย้ายข้อมูลและจากนั้นปล่อยตาราง กับลูกค้า SQL

และสามารถใช้

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

ชอบคำตอบมากมาย และจำเส้นทางที่เป็นที่ตั้ง คุณสามารถลบการโยกย้ายโมดูลแม้ในลักษณะนี้ (การโยกย้ายใด ๆ จาก anywhare)

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

และจำไว้ว่าถ้าคุณใช้เซิร์ฟเวอร์ linux ระมัดระวังเกี่ยวกับตัวพิมพ์เล็ก คุณต้องเพิ่มเช่น/ ฐานข้อมูล / การโยกย้ายด้วยทุนเริ่มต้น

/Database/Migrations/2020_05_15_xxxxxx_create_your_table.php
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.