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




ruby-on-rails database (8)

প্রতিটি শাখার জন্য পৃথক ডাটাবেস

এটা উড়তে একমাত্র উপায়।

অক্টোবর 16, 2017 আপডেট করুন

বেশ কিছুক্ষণ পর আমি ফিরে এসে কিছু উন্নতি করেছিলাম:

  • আমি একটি শাখা তৈরি করার জন্য অন্য নামস্থান রেকে টাস্ক যুক্ত করেছি এবং একের মধ্যে ডাটাবেস ক্লোন করেছি, bundle exec rake git:branch
  • আমি এখন বুঝতে পারি যে মাস্টার থেকে ক্লোনিং সর্বদা আপনি যা করতে চান তা নয় তাই আমি এটি আরও স্পষ্ট করে দিয়েছি যে db:clone_from_branch টাস্ক একটি SOURCE_BRANCH এবং একটি TARGET_BRANCH পরিবেশ পরিবর্তনশীল। SOURCE_BRANCH ব্যবহার করার সময় git:branch এটি স্বয়ংক্রিয়ভাবে বর্তমান শাখাটি SOURCE_BRANCH হিসাবে ব্যবহার করবে।
  • Refactoring এবং সরলীকরণ।

config/database.yml

এবং এটিতে আপনার পক্ষে আরও সহজ করার জন্য, আপনি বর্তমান শাখার উপর ভিত্তি করে ডেটাবেস নামটি গতিশীলভাবে নির্ধারণ করতে আপনার database.yml ফাইলটি কিভাবে আপডেট করবেন।

<% 
database_prefix = 'your_app_name'
environments    = %W( development test ) 
current_branch  = `git status | head -1`.to_s.gsub('On branch ','').chomp
%>

defaults: &defaults
  pool: 5
  adapter: mysql2
  encoding: utf8
  reconnect: false
  username: root
  password:
  host: localhost

<% environments.each do |environment| %>  

<%= environment %>:
  <<: *defaults
  database: <%= [ database_prefix, current_branch, environment ].join('_') %>
<% end %>

lib/tasks/db.rake

এখানে একটি শাখা টাস্ক সহজে এক শাখা থেকে অন্য একটি ডাটাবেস ক্লোন করতে। এটি একটি SOURCE_BRANCH এবং একটি TARGET_BRANCH পরিবেশ ভেরিয়েবলগুলি নেয়। @spalladino এর @spalladino উপর ভিত্তি করে।

namespace :db do

  desc "Clones database from another branch as specified by `SOURCE_BRANCH` and `TARGET_BRANCH` env params."
  task :clone_from_branch do

    abort "You need to provide a SOURCE_BRANCH to clone from as an environment variable." if ENV['SOURCE_BRANCH'].blank?
    abort "You need to provide a TARGET_BRANCH to clone to as an environment variable."   if ENV['TARGET_BRANCH'].blank?

    database_configuration = Rails.configuration.database_configuration[Rails.env]
    current_database_name = database_configuration["database"]

    source_db = current_database_name.sub(CURRENT_BRANCH, ENV['SOURCE_BRANCH'])
    target_db = current_database_name.sub(CURRENT_BRANCH, ENV['TARGET_BRANCH'])

    mysql_opts =  "-u #{database_configuration['username']} "
    mysql_opts << "--password=\"#{database_configuration['password']}\" " if database_configuration['password'].presence

    `mysqlshow #{mysql_opts} | grep "#{source_db}"`
    raise "Source database #{source_db} not found" if $?.to_i != 0

    `mysqlshow #{mysql_opts} | grep "#{target_db}"`
    raise "Target database #{target_db} already exists" if $?.to_i == 0

    puts "Creating empty database #{target_db}"
    `mysql #{mysql_opts} -e "CREATE DATABASE #{target_db}"`

    puts "Copying #{source_db} into #{target_db}"
    `mysqldump #{mysql_opts} #{source_db} | mysql #{mysql_opts} #{target_db}`

  end

end

lib/tasks/git.rake

এই কাজটি বর্তমান শাখা (মাস্টার, বা অন্যথায়) এর একটি গিট শাখা তৈরি করবে, এটি পরীক্ষা করে এবং বর্তমান শাখার ডাটাবেসটি নতুন শাখার ডেটাবেসে ক্লোন করবে। এটা মাতাল এএফ।

namespace :git do

  desc "Create a branch off the current branch and clone the current branch's database."
  task :branch do 
    print 'New Branch Name: '
    new_branch_name = STDIN.gets.strip 

    CURRENT_BRANCH = `git status | head -1`.to_s.gsub('On branch ','').chomp

    say "Creating new branch and checking it out..."
    sh "git co -b #{new_branch_name}"

    say "Cloning database from #{CURRENT_BRANCH}..."

    ENV['SOURCE_BRANCH'] = CURRENT_BRANCH # Set source to be the current branch for clone_from_branch task.
    ENV['TARGET_BRANCH'] = new_branch_name
    Rake::Task['db:clone_from_branch'].invoke

    say "All done!"
  end

end

এখন, আপনাকে যা করতে হবে তা হল রান bundle exec git:branch , নতুন শাখায় নাম লিখুন এবং জুম্বিদের হত্যা শুরু করুন।

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

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

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

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

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

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

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

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


আপনি শাখা প্রতি "ডিবি পরিবেশ" সংরক্ষণ করতে চান। বিভিন্ন দৃষ্টান্ত নির্দেশ করতে smudge / পরিষ্কার স্ক্রিপ্ট তাকান। আপনি যদি ডিবি ইনস্ট্যান্সের বাইরে চলে যান তবে স্ক্রিপ্টটি একটি অস্থায়ী উদাহরণটি বন্ধ করুন যাতে আপনি যখন একটি নতুন শাখায় স্যুইচ করেন, এটি ইতিমধ্যেই আছে এবং শুধুমাত্র স্ক্রিপ্টটির নাম পরিবর্তন করতে হবে। আপনি আপনার পরীক্ষা চালানোর আগে ডিবি আপডেট চালানো উচিত।

আশাকরি এটা সাহায্য করবে.


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

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

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

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

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


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

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

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

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

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


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

আপনি 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 লোড করুন (অন্য মেশিনে নতুন ডেভেলপমেন্টের জন্য ডেটা লোড করুন অথবা নতুন ডাটাবেস)

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


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

https://gist.github.com/4076864

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

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

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


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

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


যখন আপনি কোনও শাখাতে একটি নতুন মাইগ্রেশন যোগ করেন, 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 করবে।





git