ruby-on-rails - গিট শাখা এবং রেল মাইগ্রেশন সঙ্গে কিভাবে কাজ করবেন




database git (10)

যখন আপনি কোনও শাখাতে একটি নতুন মাইগ্রেশন যোগ করেন, rake db:migrate চালান rake db:migrate এবং মাইগ্রেশন এবং db/schema.rb উভয়ই db/schema.rb

যদি আপনি এটি করেন তবে, আপনি অন্য কোনও শাখাতে স্যুইচ করতে সক্ষম হবেন যেখানে মাইগ্রেশনগুলির একটি ভিন্ন সেট থাকে এবং কেবল rake db:schema:load চালান rake db:schema:load

নোট করুন যে এটি সম্পূর্ণ ডাটাবেসটি পুনঃস্থাপন করবে এবং বিদ্যমান তথ্য হারিয়ে যাবে

আপনি সম্ভবত এমন এক শাখার উত্পাদন বন্ধ করতে চান যা আপনি খুব সতর্কতার সঙ্গে রাখেন, তাই এই পদক্ষেপগুলি সেখানে প্রযোজ্য নয় (কেবল রান rake db:migrate স্বাভাবিক হিসাবে rake db:migrate )। কিন্তু ডেভেলপমেন্টে, স্কিমা থেকে ডাটাবেসটি পুনরায় তৈরি করার কোন বড় চুক্তি হওয়া উচিত নয়, যা rake db:schema:load করবে।

আমি কয়েকটি গিট শাখার সাথে একটি রেলের অ্যাপ্লিকেশনে কাজ করছি এবং এদের মধ্যে অনেকে ডিবি মাইগ্রেশন অন্তর্ভুক্ত। আমরা সতর্কতা অবলম্বন করার চেষ্টা করি কিন্তু মাঝে মাঝে মাস্টারের কোডের কিছু অংশ একটি কলামের জন্য অনুরোধ করে যা অন্য শাখায় সরানো / পুনঃনামিত হয়।

  1. ডিবি রাজ্যের সঙ্গে "দম্পতি" গিট শাখা একটি চমৎকার সমাধান হবে কি?

  2. এই "রাজ্য" আসলে কি হবে?

    যদি এটি আকারে কয়েক গিগাবাইট থাকে তবে আমরা কেবল একটি ডেটাবেস নকল করতে পারি না।

  3. এবং মার্জ সঙ্গে কি ঘটতে হবে?

  4. সমাধান কি এসএসকিউএল ডাটাবেস অনুবাদের পাশাপাশি?

    আমরা বর্তমানে মাইএসকিউএল, মংডব এবং রেডিস ব্যবহার করি

সম্পাদনা করুন: দেখে মনে হচ্ছে আমি একটি খুব গুরুত্বপূর্ণ বিষয় উল্লেখ করতে ভুলে গেছি, আমি শুধুমাত্র উন্নয়ন পরিবেশে আগ্রহী কিন্তু বৃহত্তর ডাটাবেস (আকারে কয়েক গিগাবাইট) নিয়ে আগ্রহী।


যদি আপনার কাছে একটি বড় ডাটাবেস থাকে যা আপনি সহজেই পুনরুত্পাদন করতে না পারেন তবে আমি স্বাভাবিক মাইগ্রেশন সরঞ্জামগুলি ব্যবহার করার সুপারিশ করব। যদি আপনি একটি সহজ প্রক্রিয়া চান, এই আমি সুপারিশ চাই:

  • শাখা বিন্দু আগে শাখা স্যুইচ করার আগে, রাষ্ট্র থেকে রোলব্যাক ( rake db:rollback )। তারপর, শাখাগুলি স্যুইচ করার পরে, db:migrate চালান db:migrate । এটি গাণিতিকভাবে সঠিক, এবং যতক্ষণ আপনি স্ক্রিপ্টগুলি লেখেন, ততক্ষণ এটি কাজ করবে।
  • যদি আপনি শাখাগুলি স্যুইচ করার আগে এটি করতে ভুলে যান, তবে সাধারণভাবে আপনি নিরাপদে ফিরে যেতে, রোলব্যাক এবং আবার সুইচ করতে পারেন, তাই আমি একটি কার্যপ্রবাহ হিসাবে মনে করি, এটি কার্যকর।
  • যদি আপনার বিভিন্ন শাখায় মাইগ্রেশনগুলির মধ্যে নির্ভরতা থাকে ... ভাল, আপনাকে কঠিন চিন্তা করতে হবে।

সম্ভবত আপনার এই ডেভেলপমেন্ট ডাটাবেসটি খুব বড় একটি ইঙ্গিত হিসাবে গ্রহণ করা উচিত? আপনি যদি ডিবি / বীজ.আরবি এবং বিকাশের জন্য একটি ছোট ডেটা সেট ব্যবহার করতে পারেন তবে আপনার সমস্যাটি বর্তমান শাখা থেকে schema.rb এবং seed.rb ব্যবহার করে সহজে সমাধান করা যেতে পারে।

যে আপনার প্রশ্ন উন্নয়ন সঙ্গে সম্পর্কিত অনুমান; আমি নিয়মিত উত্পাদন শাখা সুইচ করতে হবে কেন আপনি কল্পনা করতে পারবেন না।


এখানে বিভিন্ন স্ক্রিপ্টগুলির মধ্যে শাখাগুলির জন্য স্যুইচ করার জন্য লেখা একটি স্ক্রিপ্ট রয়েছে:

https://gist.github.com/4076864

এটি আপনি উল্লেখ করা সব সমস্যার সমাধান হবে না, কিন্তু একটি শাখা নাম দেওয়া হবে:

  1. প্রদত্ত শাখায় উপস্থিত না থাকা আপনার বর্তমান শাখায় যে কোনও মাইগ্রেশন পুনরুদ্ধার করুন
  2. ডিবি / schema.rb ফাইল থেকে কোনও পরিবর্তন বাতিল করুন
  3. প্রদত্ত শাখা পরীক্ষা করে দেখুন
  4. প্রদত্ত শাখা বিদ্যমান কোনো নতুন মাইগ্রেশন চালান
  5. আপনার টেস্ট ডাটাবেস আপডেট করুন

আমি নিজে নিজে আমাদের প্রোজেক্টে এই সব কাজ করি, তাই আমি ভাবলাম এটি প্রক্রিয়াটি স্বয়ংক্রিয়ভাবে করা ভাল।


উন্নয়ন পরিবেশে:

আপনি rake db:migrate:redo সঙ্গে কাজ করা উচিত rake db:migrate:redo আপনার স্ক্রিপ্ট পরিবর্তনশীল কিনা পরীক্ষা করতে rake db:migrate:redo , কিন্তু মনে রাখবেন ডেটা জনসংখ্যার সাথে একটি seed.rb থাকা উচিত।

আপনি যদি জিট দিয়ে কাজ করেন তবে আপনি seed.rb একটি মাইগ্রেশন পরিবর্তনের সাথে পরিবর্তন এবং db:migrate:redo সম্পাদন করতে পারেন db:migrate:redo শুরু করার জন্য db:migrate:redo লোড করুন (অন্য মেশিনে নতুন ডেভেলপমেন্টের জন্য ডেটা লোড করুন অথবা নতুন ডাটাবেস)

'আপচেঞ্জ' ছাড়া, আপনার আপ এবং ডাউন পদ্ধতিগুলির সাথে আপনার কোড সর্বদা এই মুহুর্তে "পরিবর্তন" এবং শূন্য থেকে শুরু হওয়ার ক্ষেত্রে পরিস্থিতিগুলি কভার করে।


আমি আপনি এখানে থাকার পিটা অভিজ্ঞতা সম্পূর্ণরূপে। আমি এটি সম্পর্কে মনে করি, আসল সমস্যা হল যে সমস্ত শাখায় নির্দিষ্ট শাখাগুলি রোলব্যাক করার কোড নেই। আমি django বিশ্বের মধ্যে, তাই আমি ভাল যে rake জানি না। আমি এই ধারণার সাথে লজ্জা পাচ্ছি যে মাইগ্রেশনগুলি তাদের নিজস্ব রেপোতে থাকে যা ব্র্যাঞ্চেড না (জিটি-সাবডুডুল, যা আমি সম্প্রতি শিখেছি)। এইভাবে সমস্ত শাখায় সমস্ত স্থানান্তর আছে। চটচটে অংশটি নিশ্চিত করছে যে প্রতিটি শাখা কেবল তাদের জন্য যে অভিবাসনের বিষয়ে উদ্বিগ্ন তা সীমাবদ্ধ। যে / ট্র্যাক পালন ম্যানুয়ালি একটি পিটা হতে হবে এবং ত্রুটি প্রবণ। কিন্তু মাইগ্রেশন সরঞ্জাম এই জন্য নির্মিত হয় না। যে পয়েন্ট আমি এগিয়ে একটি উপায় ছাড়া am।


আমি একই সমস্যা সঙ্গে সংগ্রাম ছিল। এখানে আমার সমাধান:

  1. Schema.rb এবং সমস্ত মাইগ্রেশন উভয় ডেভেলপারদের দ্বারা চেক করা হয়েছে তা নিশ্চিত করুন।

  2. উত্পাদন স্থাপনার জন্য একটি ব্যক্তি / মেশিন থাকা উচিত। চলুন এই মেশিনটি মার্জ মেশিন হিসাবে কল করুন। যখন পরিবর্তনগুলি মার্জ মেশিনে টেনে আনা হয়, তখন schema.rb এর জন্য স্বয়ংক্রিয়-মার্জ ব্যর্থ হবে। কোন কারণ নাই. Schema.rb এর জন্য পূর্ববর্তী সামগ্রীগুলির সাথে কেবলমাত্র সামগ্রীটি প্রতিস্থাপন করুন (যদি আপনি এটি ব্যবহার করেন তবে আপনি একটি কপি সরাইয়া রাখতে পারেন বা এটি গিথব থেকে পেতে পারেন ...)।

  3. এখানে গুরুত্বপূর্ণ পদক্ষেপ। সমস্ত ডেভেলপারদের থেকে মাইগ্রেশন এখন ডিবি / মাইগ্র্রেট ফোল্ডারে উপলব্ধ হবে। এগিয়ে যান এবং বান্ডিল সঞ্চালন রান ডিবি চালান: মাইগ্রেট। এটি সমস্ত পরিবর্তন সমতুল্য মজিল মেশিনে ডাটাবেস আনতে হবে। এটি schema.rb পুনর্জন্ম করা হবে।

  4. Commits এবং সমস্ত রিপোজিটরিতে পরিবর্তন ধাক্কা (রিমোট এবং ব্যক্তি, যা খুব remotes হয়)। আপনি করা উচিত!


আমি দুটি অপশন এক সুপারিশ করবে:

বিকল্প 1

  1. seeds.rb আপনার তথ্য রাখুন। একটি চমৎকার বিকল্প FactoryGirl / ফ্যাব্রিকেশন মণির মাধ্যমে আপনার বীজ তথ্য তৈরি করা হয়। এই ভাবে আপনি গ্যারান্টি দিতে পারেন যে আমরা যদি অনুমান করি যে ডেটা কোডের সাথে সিঙ্ক হয় তবে কলামগুলি যোগ / অপসারণের সাথে সাথে কারখানাগুলিকে একসাথে আপডেট করা হয়।
  2. এক শাখা থেকে অন্যটিতে স্যুইচ করার পরে, রান rake db:reset চালান rake db:reset , যা কার্যকরীভাবে ড্রপ / তৈরি / ডেটাবেস বীজ।

বিকল্প 2

rake db:rollback / rake db:migrate সর্বদা একটি শাখা চেকআউটের পূর্বে / পরে rake db:migrate । সতর্কতা হল যে আপনার সমস্ত স্থানান্তরগুলি উল্টো হতে হবে, অন্যথায় এটি কাজ করবে না।


আমি এটা করেছি এবং আমি নিশ্চিত নই যে আমি সমস্ত ঘাঁটি আচ্ছাদিত করেছি:

উন্নয়ন (postgresql ব্যবহার করে):

  • sql_dump db_name> tmp / branch1.sql
  • জিট চেকআউট শাখা 2
  • dropdb db_name
  • createdb db_name
  • psql db_name <tmp / branch2.sql # (আগের শাখা সুইচ থেকে)

এটি প্রায় 50K রেকর্ডগুলির সাথে ডেটাবেসে রেকে ইউটিলিটিগুলির তুলনায় অনেক দ্রুত।

উৎপাদনের জন্য, প্রধান শাখাকে বাদ্যযন্ত্র হিসাবে বজায় রাখুন এবং সমস্ত মাইগ্রেশন চেক করা হয়, shema.rb সঠিকভাবে মার্জ করা হয়েছে। আপনার মান আপগ্রেড পদ্ধতি মাধ্যমে যান।


শুধু এই অবস্থা ছিল:

Branch one: A B C D E F     J   L M  
                       \ (Merge)
Branch two:             G I   K     N

আমি সঞ্চালিত:

git branch newbranch 
git reset --hard HEAD~8 
git checkout newbranch

আমি আশা করি যে আমি শিরোনাম হব, কিন্তু এখনই এটি এল ...

ইতিহাসে সঠিক স্থানে অবতরণ করা নিশ্চিত হবার পক্ষে হ্যাশের সাথে কাজ করা সহজ

git branch newbranch 
git reset --hard #########
git checkout newbranch






ruby-on-rails database git