রোলব্যাক লারাভেলের একটি নির্দিষ্ট মাইগ্রেশন


238

আমি চাই

শুধুমাত্র রোলব্যাক করতে:

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টেবিল উভয়ই অনিচ্ছাকৃতভাবে। আমি কখনই তা ঘটতে চাই না এবং আমি যদি কেবলমাত্র সেই নির্দিষ্টটিকেই রোলব্যাক করতে পারি তবে এই বিপর্যয় কখনই ঘটবে না।


46
ভোট দিন! আপনি যেভাবে এই প্রশ্নটি লিখেছেন কেবল তার জন্য :)
স্লিক

আমি স্ক্লোপ্রো ব্যবহার করছি, এটি আমাকে ব্যাচের নম্বরটি পরিবর্তন করতে দেয়, সুতরাং আমি কেবল নম্বরটি পরিবর্তন করেছি এবং কেবল রোলব্যাক করেছি
রোল করুন

ভবিষ্যতের রোলব্যাকগুলি বিবেচনা করে, প্রতিটি মাইগ্রেশন ধাপে ধাপে চালাতে 'পিএইচপি কারিগর মাইগ্রেট - স্টেপ' ব্যবহার করুন যা আপনি পিএইচপি আর্টিসান মাইগ্রেট চালানোর সময় কেবল একটি মাইগ্রেশন রোলব্যাক করবে: রোলব্যাক
জেমস

উত্তর:


146

আপনি যদি আপনার migrationsটেবিলটিতে সন্ধান করেন তবে আপনি দেখতে পাবেন যে প্রতিটি মাইগ্রেশনের একটি ব্যাচের নম্বর রয়েছে। সুতরাং আপনি যখন পিছনে রোল করবেন, এটি প্রতিটি ব্যাগের শেষ পর্বের অংশ ছিল back

আপনি যদি কেবলমাত্র শেষ মাইগ্রেশনটি ফিরে যেতে চান, তবে কেবল একটি করে ব্যাচের সংখ্যা বাড়িয়ে দিন। এরপরে আপনি যখন rollbackকমান্ডটি চালাবেন , এটি কেবলমাত্র সেই এক স্থানান্তরকেই আবার ফিরিয়ে আনবে কারণ এটি তার নিজের একটি "ব্যাচে" রয়েছে।


ভাল সুপারিশ! আমি ব্যাচ নম্বর সম্পাদনা করার চেষ্টা করেছি, এটি আমাকে দেয় না। এটি এক ধরণের লক এবং ধূসর। আমি আমার ম্যাকের মাইএসকিউএল ওয়ার্কবেঞ্চে চেষ্টা করেছি। কোন ধারণা?
সাইবার 8200

আমি যখন তাদের কনফিগার করার চেষ্টা করেছি তখন কেন, আমার ব্যাচের নম্বরটি লক হয় তা কি জানেন?
সাইবার 8200

1
মাইগ্রেশন সারণিতে ব্যাচের নম্বর আপডেট করুন যেমন: ক্যারিয়ারের আপডেট করুন migrationsSET batch= 2 WHERE migration= 'name_of_the_migration';
ইমরান খান

3
@ ইমরান খান ব্যাচ নম্বরটি '2' তে হার্ড কোডিং করা আপনার পক্ষে দুটি ব্যাচের বেশি থাকলে বিশেষত দুর্দান্ত নয়।
মার্টিন বিন বিন

আপনার মাইগ্রেশন টেবিলটি সহজে সম্পাদনা করতে এবং ব্যাচের নম্বরগুলি পরিবর্তন করতে সিকুয়েল প্রো (কেবলমাত্র ম্যাক ওএসের জন্য) ব্যবহার করুন।
আরসলান রামায়

271

লারাভেল 5.3+

রোলব্যাক এক ধাপ। নেটিভ।

php artisan migrate:rollback --step=1

এবং ম্যানুয়াল পৃষ্ঠাটি এখানে: ডক্স


লারাভেল 5.2 এবং এর আগে

কোনও ঝামেলা ছাড়াই করার উপায় নেই। বিশদ জন্য, মার্টিন বিন এর উত্তর পরীক্ষা করুন ।


1
যদিও ওপি লারাভেলের ইন-ডেভেলপমেন্ট সংস্করণ দিয়ে তার অ্যাপ্লিকেশনটি না লিখেছে না সে ক্ষেত্রে দরকারী।
মার্টিন বিন ২

4
এটি একটি ভাল বৈশিষ্ট্য হবে তবে কোনটি স্থানান্তরকে রোলব্যাক করতে হবে তা নির্দিষ্ট করার জন্য এটি কার্যকারিতাটি হারিয়েছে । আমি ধরে নিলাম এটি কেবলমাত্র মাইগ্রেশন সারণীতে তালিকাভুক্ত সর্বশেষটি রয়েছে? আমি যখন জিনিসগুলি স্থানান্তর করি তখন আমি সাধারণত ফিরে ঘোরার পরিকল্পনা করি না , সুতরাং আমি শেষের স্থানান্তর হওয়ার কারণে যে স্থানান্তরণটি ফিরে পেতে চাই তা খুব বেশি নয়। দেখে মনে হচ্ছে লারাভেল ধরণের একটিকে বলটি ফেলে দেওয়া হয়েছে। একক মাইগ্রেশন রোলব্যাকের একমাত্র নিরাপদ উপায় হ'ল মাইগ্রেশন টেবিলটি ম্যানুয়ালি সম্পাদনা করা I
স্কেটিস

@ স্কিটিস'রেলি সম্মত হয়েছে, মাইগ্রেশনগুলি খুব ভালভাবে ভাবা হয় না। তবে তারা এখানে রয়েছে তাই আপনাকে শুরু থেকেই মাইগ্রেশন প্যাকেজ সন্ধান করতে বাধ্য করা হবে না।
ইয়াউহেনী প্রকোপাচাইক

এটি একটি মোহন মত কাজ করে। আমি একটি নতুন মাইগ্রেশন বিকাশ করছিলাম (বিদ্যমান টেবিলটিতে একটি কলাম যুক্ত করছি), তারপরে আমি দেখলাম "ইউইইডি" টাইপের সাথে আমি স্থানান্তরিত হয়েছি, আমি "স্ট্রিং" চেয়েছিলাম। আপনার রোলব্যাক টিপটি পুরোপুরি কার্যকর হয়েছিল। রোলব্যাক। আপডেট কোড। আবার হিজরত করুন। => 100% ঠিক আছে। লারাভেল 5.7
ফ্লোরিয়ান ডায়েন

(php artisan) কমান্ড লাইন দ্বারা আমি কীভাবে আমার শেষ এন স্থানান্তর পদক্ষেপগুলি আনতে পারি। যদি আমি চাই তবে আমি আমার স্থানান্তরের টেবিলটি ডিবি পেতে এবং আমার ইতিহাস এবং আমার শেষ মাইগ্রেশনটি চালানোর জন্য জিজ্ঞাসা করতে পারি। তবে অন্যদিকে, আমি সর্বদা আমার স্থানান্তর ফোল্ডারটি ব্যবহার করতে পারি না কারণ নতুন মাইগ্রেশনটি সর্বদা সাজানো হয় না। এই সমস্যার জন্য আমি কেবলমাত্র প্রস্তাব দিই যে আমরা পিএইচপি আর্টিসান মেক ব্যবহার করুন: মাইগ্রেশন এবং বিদ্যমান ফাইলগুলির মধ্যবর্তী স্থানান্তর ফাইলগুলির অনুলিপি ব্যবহার করবেন না।
সাবের তাবতাবই ইয়াজদী

24

যতবার আপনি রোলব্যাক করবেন তখন মাইগ্রেশনের শেষ ব্যাচটি পাবেন। কমান্ড ব্যবহার করুন

php artisan migrate:rollback --step=1

18

যদি আপনি @ মার্টিন বিনের যা বলেছে তা করতে না পারেন, তবে আপনি অন্য কৌশল চেষ্টা করতে পারেন।

একটি নতুন মাইগ্রেশন তৈরি করুন এবং সেই ফাইলটিতে আপ () পদ্ধতিতে আপনি যে মাইগ্রেশনটি রোলব্যাক করতে চান তার ডাউন () পদ্ধতিতে কী সন্নিবেশ করান এবং ডাউন () পদ্ধতিতে কী (আপ) পদ্ধতিতে রয়েছে তা sertোকান।

যেমন যদি আপনার আসল মাইগ্রেশনটি এটির মতো হয়

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
@ অল্প দেরীতে তবে আপনি ইউআই ব্যবহার করে এটি সম্পাদনা করতে পারবেন না কারণ টেবিলের স্থানান্তরগুলির প্রাথমিক কী নেই। এটি সম্পাদনা করার জন্য আপনাকে স্কয়ার লিখতে হবে।
ভিক

15

ব্যবহৃত রিফ্রেশ স্থানান্তর ভাল

আপনি রিফ্রেশ কমান্ডের পদক্ষেপ বিকল্পটি সরবরাহ করে সীমিত সংখ্যক মাইগ্রেশন রোলব্যাক ও পুনরায় স্থানান্তর করতে পারেন। উদাহরণস্বরূপ, নিম্নলিখিত কমান্ডটি শেষ দুটি স্থানান্তরকে রোলব্যাক করবে এবং পুনরায় স্থানান্তর করবে:

php artisan migrate:refresh --step=2

অন্যথায় ব্যবহৃত রোলব্যাক স্থানান্তর করুন

আপনি রোলব্যাক কমান্ডের পদক্ষেপ বিকল্পটি সরবরাহ করে সীমিত সংখ্যক মাইগ্রেশন রোলব্যাক করতে পারেন। উদাহরণস্বরূপ, নিম্নলিখিত কমান্ডটি শেষ তিনটি স্থানান্তরকে রোলব্যাক করবে:

php artisan migrate:rollback --step=3

মাইগ্রেশন সম্পর্কে আরও তথ্যের জন্য দেখুন


11

সেরা উপায় হ'ল একটি নতুন মাইগ্রেশন তৈরি করা এবং এতে প্রয়োজনীয় পরিবর্তন করা।

সবচেয়ে খারাপ ক্ষেত্রে কাজ (আপনার যদি ডিবি অ্যাক্সেস থাকে তবে আপনি সেই টেবিলের ডেটা রিসেট দিয়ে ঠিক করেন ):

  1. ডিবিতে যান এবং মাইগ্রেশন এন্ট্রি মুছুন / পুনরায় নামকরণ করুনyour-specific-migration
  2. ড্রপ দ্বারা নির্মিত টেবিলyour-specific-migration
  3. চালান php artisan migrate --path=/database/migrations/your-specific-migration.php

এটি লারাভেলের মাইগ্রেশন ইতিহাসে কোনও প্রবেশ নেই বলে এই নির্দিষ্ট মাইগ্রেশনটি চালাতে বাধ্য করবে

আপডেট : লারাভেল উপায় (ধন্যবাদ, @ থিয়াগো-ভ্যালেন্টে)

চালান:

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

এবং তারপর:

php artisan migrate

এটি সেই নির্দিষ্ট স্থানান্তরকে পুনরায় চালাবে run


4
আমি php artisan migrate:rollback --path=/database/migrations/your-specific-migration.phpএবং পরিশেষে ব্যবহার করেছি php artisan migrate
থিয়াগো ভ্যালেন্টে

8

এই প্রশ্নের উত্তর দিতে দেরি হতে পারে তবে এটি অনুভব করার জন্য এখানে একটি খুব ভাল, পরিষ্কার এবং দক্ষ উপায় way আমি যথাসাধ্য চেষ্টা করার চেষ্টা করব

আপনার মাইগ্রেশন তৈরির আগে বিভিন্ন ডিরেক্টরি তৈরি করুন:

    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 বা আপনি যে কোনও ফোল্ডারের নাম মাইগ্রেশন ফাইলগুলি সংরক্ষণ করছেন তা করতে পারেন As যতক্ষণ না এটি ডাটাবেস / মাইগ্রেশন ডিরেক্টরি বা কোনও নির্দিষ্ট ডিরেক্টরিতে থাকে।

আপনার যদি আপনার নির্দিষ্ট স্থানান্তরকে রোলব্যাকের প্রয়োজন হয় তবে আপনি নীচের মত ব্যাচের মাধ্যমে রোলব্যাক করতে পারেন:

    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 য়। আমি জানি না যে মাইগ্রেশনগুলি বিভিন্ন ফোল্ডারে রাখলে তা আদৌ বদলে যাবে, তবে আমি এটির আশা করব না। যদি নাম দ্বারা রোলব্যাক নির্দিষ্ট করে কাজ করে তবে তা দুর্দান্ত হবে! আপনি যদি রোলব্যাক কোনও আর্গুমেন্ট দেন তবে, এটি "অত্যধিক যুক্তি" অভিযোগ করে।
স্কিটিস

4

রোলব্যাক এক ধাপ। নেটিভ।

php artisan migrate:rollback --step=1

রোলব্যাক দুই ধাপ। নেটিভ।

php artisan migrate:rollback --step=2


4

আপনি যদি শেষ মাইগ্রেশন রোলব্যাক করতে চান।

php artisan migrate:rollback

আপনি যদি নির্দিষ্ট মাইগ্রেশনটি রোলব্যাক করতে চান তবে মাইগ্রেশন সারণিতে যান এবং ব্যাচের মধ্যে এই রেকর্ডের সর্বোচ্চ মান নির্ধারণ করুন। তারপর।

php artisan migrate:rollback

বর্তমানে আমি লারাভেল ৫.৮ এ কাজ করছি যদি লারাভেলের অন্য কোনও সংস্করণ না কাজ করে তবে আমাকে জানান।


আমার জন্য দরকারী ছিল। শেষ মাইগ্রেশনের সাথে ঠিক এমন ঘটনা case
কোডটোলাইফ

3

এক এক করে সারণী স্থানান্তর করুন।

আপনি যে স্থানান্তর করতে চান তার ব্যাচের নম্বরটি সর্বোচ্চে রোলব্যাক করুন।

চালান স্থানান্তর: রোলব্যাক।

বৃহত্তর প্রকল্পগুলি মোকাবেলা করার জন্য সবচেয়ে আরামদায়ক উপায় নাও হতে পারে।


3

আপনি যদি আসল মাইগ্রেশন ফাইলটি পরিবর্তন করতে চান এবং এটি আবার মাইগ্রেট করতে চান তবে আপনি এই প্যাকেজটি স্থানান্তরিত করতে ব্যবহার করতে পারেন । ( লারাভেল 5.4 বা তার পরে প্রযোজ্য )

প্রথমে আপনার লারাভেল প্রকল্পে প্যাকেজ ইনস্টল করুন:

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

১) ডাটাবেসটির অভ্যন্তরে মাইগ্রেশন সারণীতে যেতে হবে এবং যে টেবিলটি আপনি নামাতে চান তা সম্পর্কিত মাইগ্রেশনের এন্ট্রি মুছুন।

অভিবাসন টেবিল চিত্র উদাহরণ

২) এরপরে, নির্দেশ সন্ধান থেকে সবেমাত্র মুছে ফেলা মাইগ্রেশন সম্পর্কিত টেবিলটি মুছুন।

সারণী চিত্র উদাহরণ মুছুন

৩) অবশেষে, আপনি যে নম্বরটি নির্দেশনা থেকে মোছা সারণীর মাইগ্রেশন ফাইলটিতে চান তা পরিবর্তন করুন। 2 তারপরে php artisan migrateআবার টেবিলটি স্থানান্তর করতে চালান ।


0

লারাভেল ম্যানুয়ালটিতে যেমন বলা হয়েছে , আপনি --stepবিকল্পটি ব্যবহার করে নির্দিষ্ট সংখ্যক মাইগ্রেশন ফিরিয়ে আনতে পারেন

php artisan migrate:rollback --step=5

কেবল লারাভেল 5.3, সুতরাং সেই সংস্করণের নীচে কোড করা কোনও কিছুই এটি ব্যবহার করতে পারে না
জেফজ

এটি ওপি-র ক্ষেত্রে সহায়তা করবে না, যেহেতু এটি কোনও নির্দিষ্ট স্থানান্তর নয়, নির্দিষ্ট সংখ্যক মাইগ্রেশন রোলব্যাক করবে। "--step3" এখনও 3 টি মাইগ্রেশন রোলব্যাক করবে।
স্কেয়েট

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এবং এটি কেবলমাত্র সেই ফাইলটি স্থানান্তরিত করবে।

এই প্রক্রিয়াটি আপনাকে প্রতিবার একটি সম্পূর্ণ রিফ্রেশ এবং বীজ না করে মাইগ্রেশনে নির্দিষ্ট পরিবর্তন করতে দেয় allows

ব্যক্তিগতভাবে আমার এগুলি করা খুব দরকার কারণ আমার বীজগুলি বরং বড়।


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

0

আপনার যদি ডিবিতে অ্যাক্সেস থাকে তবে আপনার কাছে আরও সহজ সমাধান রয়েছে। আপনি স্থানান্তর টেবিল থেকে রেকর্ডটি মুছতে পারেন এবং তারপরে কেবল টেবিলটি ফেলে দিন drop এসকিউএল ক্লায়েন্টের সাথে।

এবং ব্যবহার করতে পারেন

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.