1. আটলাসের পরিচিতি

আটলাস

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

  • ঘোষণামূলক: টেরাফর্মের মতো, আটলাস বর্তমান ডাটাবেসের অবস্থার সাথে এইচসিএল, এসকিউএল, বা ওআরএম স্কিমা দ্বারা নির্ধারিত করা মাইগ্রেশন পরিকল্পনা তৈরি এবং প্রয়োগ করে।
  • সংষ্করণমূল মোড: অন্য সরঞ্জামগুলোর বিপরীতে, আটলাস নিজেই স্কিমা মাইগ্রেশনের পরিকল্পনা করে। ব্যবহারকারীরা তাদের পছন্দমত ওআরএম, এইচস

3. এটলাস ব্যবহার করে বিদ্যমান ডাটাবেস টেবিল স্ট্রাকচার রপ্তানি

এটলাস atlas schema inspect কমান্ড প্রদান করে, যা ব্যবহার করা যেতে পারে বিদ্যমান ডাটাবেসের স্ট্রাকচার রপ্তানি করতে। এই কমান্ডটি ডাটাবেস URL থেকে ডাটাবেস বিবরণ পড়াবে এবং তাদের তিনটি ভিন্ন রূপে: ডিফল্ট অ্যাটলাস HCL ফরম্যাট, SQL ফরম্যাট এবং JSON ফরম্যাটে আউটপুট করতে ব্যবহার করা যায়। এই গাইডে, আমরা দেখাব কীভাবে অ্যাটলাস HCL এবং SQL ফরম্যাট ব্যবহার করতে হয়, কারণ JSON ফরম্যাট টি সাধারণত jq দিয়ে আউটপুট প্রসেস করার জন্য ব্যবহৃত হয়।

আপনি যদি স্থানিকভাবে চলমান MySQL ইনস্ট্যান্স রিপোর্ট করতে এবং আউটপুটটি ফাইলে লিখতে চান "schema.hcl" নামের ফাইল, তাহলে নিম্নলিখিত কমান্ডটি ব্যবহার করুন।:

atlas schema inspect -u "mysql://root:pass@localhost:3306/example" > schema.hcl

schema.hcl ফাইল খোলতে অটলাস টেবিল স্ট্রাকচার সংজ্ঞা বর্ণনা দেখতে। উদাহরণস্বরূপ, এই ফাইলটি নিম্নলিখিত ভাবে থাকবে:

      table "users" {
      schema = schema.example
      column "id" {
        null = false
        type = int
      }
      column "name" {
        null = true
        type = varchar(100)
      }
      primary_key {
        columns = [column.id]
      }
    }

এই কোড ব্লকটি id এবং name কলাম সহ টেবিল স্ট্রাকচার প্রতিনিধিত্ব করে। স্কিমা ফিল্ড আলাদা করে ডাটাবেস (HCL হল অ্যাটলাস দ্বারা নির্ধারিত ডেটাবেস-অবিপন্ন টেবিল স্ট্রাকচার কনফিগারেশন ফরম্যাট) এর সংজ্ঞা প্রসঙ্গ অন্য কোথায় নির্ধারিত করে। ছাত্র প্রধান এই id কলামের উপর প্রাথমিক কী হিসাবে নির্ধারিত। অ্যাটলাস তাদের অপারেট করা ডাটাবেজের সিনট্যাক্স অনুকরণ করার চেষ্টা করে। উদাহরণ হিসাবে, এই উদাহরণে, id কলামের এন্টাইপি হল int, যেখানে নাম কলামের এন্টাইপি হল varchar(100)

অনুরূপভাবে, ডাটাবেসের SQL মডেল সংজ্ঞা রপ্তানি করতে, আপনি নিম্নলিখিত কমান্ডটি ব্যবহার করতে পারেন:

atlas schema inspect -u "mysql://root:pass@localhost:3306/example" --format '{{ sql . }}' > schema.sql

schema.sql ফাইল খোলতে ডাটাবেসের এসকিউএল বর্ণনা দেখুন, সাধারণত কিছু CREATE TABLE বিবরণী থাকবে।

এই পদ্ধতিটি বিদ্যমান ডাটাবেস টেবিল স্ট্রাকচারের বিবরণ বুঝতে সুবিধা প্রদান করে এবং পরবর্তী সংস্করণযুক্ত মাইগ্রেশনের জন্য একটি সঠিক উল্লিখিত সন্দর্ভ প্রদান করে।

4.2.1 পার্থক্য গণনা করুন

মাইগ্রেশন শুরু করার আগে, বর্তমান ডাটাবেস স্ট্রাকচার এবং প্রয়োজনীয় অবস্থা তুলনা করা এবং দুটির মধ্যে পার্থক্য নির্ধারণ করা প্রয়োজন। এটি করা যায় atlas migrate diff কমান্ড চালানোর মাধ্যমে।

atlas migrate diff create_blog_posts \
  --dir "file://migrations" \
  --to "file://schema.hcl" \
  --dev-url "docker://mysql/8/example"

--dir মাইগ্রেশন ফোল্ডারের URL নির্দেশ করে, যা file://migrations ডিফল্ট হয়। --to প্রায়োজনীয় অবস্থার URL নির্দেশ করে (উদাহরণস্বরূপ, আপনার বিকাশের এনভায়রনমেন্ট ডাটাবেস), এবং --dev-url উন্নয়নের ডিয়েভলপমেন্টের ডাটাবেসের জন্য URL সরবরাহ করে (নোট করুন যে --dev-url এটলা খালি ডাটাবেসের URL নির্দিষ্ট করতে হবে যাতে পার্থক্য হিসাবে ব্যবহার করা হয়)।

পরামর্শ: যদি আপনি SQL ফাইলগুলি জেনারেট করতে চান, তবে --format প্যারামিটার ব্যবহার করে ফরম্যাট সেট করা এবং আগের অধ্যায়ে রেফার করুন।

4.2.2 মাইগ্রেশন পরিবর্তন প্রয়োগ করুন

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

-- "blog_posts" টেবিল তৈরি করুন
CREATE TABLE `blog_posts` (
  `id` int NOT NULL,
  `title` varchar(100) DEFAULT NULL,
  `body` text DEFAULT NULL,
  `author_id` int NULL REFERENCES `users`(id),
  PRIMARY KEY (`id`)
);

মাইগ্রেশন ফাইলগুলি তৈরি হওয়ার পরে, আপনি ভার্সন কন্ট্রোল টুল (উদাহরণস্বরূপ, গিট) ব্যবহার করে এই পরিবর্তনগুলি পরিচালনা করতে পারেন। এই পদ্ধতি ব্যবহার করে উন্নয়নের ডিভেলপমেন্ট এনভায়রনমেন্টে বিভিন্ন ডাটাবেস টেবিল স্ট্রাকচার পরিবর্তন করার সুযোগ প্রদান করে, এবং যখন রিলিজের সময় হয়, আটলাসের কমান্ড ব্যবহার করে উন্নয়ন এবং UAT এনভায়রনমেন্ট তুলনা করা হয়ে ডাটাবেস টেবিল স্ট্রাকচার মাইগ্রেশন ফাইল তৈরি করা। এই মাইগ্রেশন ফাইলগুলি তারপর UAT এবং প্রোডাকশন এনভায়রনমেন্টে প্রয়োগ করা যাবে ডাটাবেস আপগ্রেড করার জন্য।

এই দুটি ওয়ার্কফ্লো, ডেক্লারেটিভ এবং ভার্সনেড, বিভিন্ন ডেভেলপমেন্ট এবং ডিপ্লয়মেন্ট মোডের জন্য সমযোজ্জিত প্রযুক্তি সরবরাহ করে, যা ডাটাবেস স্কিমা পরিবর্তনের জন্য তাদের প্রজেক্ট এর প্রয়োজনীয় পদ্ধতি নির্বাচন করার সুযোগ দেয়।

5. HCL ফরম্যাট বর্ণনা

5.1 পরিচিতি

HCL হল একটি ঘোষণামূলক ভাষা যা ডাটাবেস টেবিল স্ট্রাকচার সংজ্ঞানা করার জন্য ব্যবহৃত হয়। আটলাস HCL ফরম্যাট ব্যবহার করে ডাটাবেস স্কিমা লিখতে, যা বিভিন্ন দিক বর্ণনা করার জন্য একটি ধারণ সরবরাহ করে। HCL এর সুবিধা হল এর পঠনযোগ্যতা, সহজতা রক্ষণ এবং ভেরিয়েবল ইনজেকশন এবং অতিরিক্ত এনটোটেশন সহ বৈশিষ্ট্য সমর্থন করা।

পরামর্শ: আপনার প্রজেক্ট যদি একাধিক ডাটাবেসের সাথে অনুকূল হতে হয়, তবে HCL ব্যবহার করে এটি একটি খুব সুবিধাজনক পদ্ধতি হতে সক্ষম হতে পারে যেখানে ডেটাবেসের স্ট্রাকচার পরিভাষা করা হয়।

5.2 স্কিমা অবজেক্ট

schema অবজেক্টটি ডাটাবেস স্কিমা বর্ণনা করার জন্য ব্যবহৃত হয়। MySQL এবং SQLite তে, এটি ডাটাবেস প্রতিনিধিত্ব করে, যখন PostgreSQL এ, এটি স্কিমা প্রতিনিধিত্ব করে। HCL ফাইলে এক বা একাধিক schema অবজেক্ট থাকতে পারে।

schema "public" {
  comment = "একটি স্কিমা মন্তব্য"
}

schema "private" {}

5.3 টেবিল অবজেক্ট

table অবজেক্টটি SQL ডাটাবেসে একটি টেবিল বর্ণনা করার জন্য ব্যবহৃত হয়, যা কলাম, ইনডেক্স, পরিবৈধতা এবং বিভিন্ন বিভিন্ন ডাটাবেস ড্রাইভার দ্বারা সমর্থিত বৈশিষ্ট্য বর্ণনা করে।

table "users" {
  schema = schema.public
  column "id" {
    type = int
  }
  column "name" {
    type = varchar(255)
  }
  column "manager_id" {
    type = int
  }
  primary_key {
    columns = [
      column.id
    ]
  }
  index "idx_name" {
    columns = [
      column.name
    ]
    unique = true
  }
  foreign_key "manager_fk" {
    columns     = [column.manager_id]
    ref_columns = [table.users.column.id]
    on_delete   = CASCADE
    on_update   = NO_ACTION
  }
}

5.4 কলাম অবজেক্ট

কলাম টেবিলের কলাম সংজ্ঞানা করার জন্য table এর একটি সব-রিসোর্স হয়।

column "name" {
  type = text
  null = false
}

column "age" {
  type = integer
  default = 42
}

column "active" {
  type = tinyint(1)
  default = true
}

5.5 primary_key অবজেক্ট

primary_key টি table এর একটি সাব-রিসোর্স, যা টেবিলের প্রাথমিক কী নির্ধারণ করে।

primary_key {
  columns = [column.id]
}

5.6 foreign_key অবজেক্ট

foreign_key টি table এর একটি সাব-রিসোর্স, যা অন্যান্য টেবিলের কলামের উপর সম্প্রেষণ করা কলাম নির্ধারণ করে।

table "orders" {
  schema = schema.market
  // ...
  column "owner_id" {
    type = integer
  }
  foreign_key "owner_id" {
    columns     = [column.owner_id]
    ref_columns = [table.users.column.id]
    on_update   = NO_ACTION
    on_delete   = NO_ACTION
  }
}

5.7 index অবজেক্ট

index অবজেক্টটি টেবিলে একটি সূচক প্রতিনিধিত্ব করে।

index "idx_name" {
  columns = [
    column.name
  ]
  unique = true
}