1. مائیگریشن میکانزم کا جائزہ

1.1 مائیگریشن کے تصور اور کردار

ڈیٹا بیس مائیگریشن وہ عمل ہے جس میں ڈیٹا ماڈل کی تبدیلیوں کو ڈیٹا بیس ساخت میں ہم آہنگ کرنا ہوتا ہے، جو ڈیٹا کی استمراریت کے لیے اہم ہے۔ جب بھی ایپلیکیشن ورژن تبدیل ہوتا ہے، تو ڈیٹا ماڈل میں تبدیلیوں کا سامنا ہوتا ہے، جیسے کہ فیلڈز کا اضافہ ہونا یا ہٹانا یا انڈیکسوں کی ترتیب بدلنا۔ مائیگریشن ڈویلپر کو ان تبدیلیوں کو ایک ورژن کردہ اور نظامی طریقے سے منظم کرنے کا موقع فراہم کرتی ہے، جس سے ڈیٹا بیس ساخت اور ڈیٹا ماڈل کے درمیان موازنے کی یقینیت یقینیت ہوتی ہے۔

معاصر ویب ڈویلپمنٹ میں، مائیگریشن میکانزم مندرجہ ذیل فوائد فراہم کرتا ہے:

  1. ورژن کنٹرول: مائیگریشن فائلز ڈیٹا بیس ساخت کی تبدیلیوں کی تاریخ کو ٹریک کر سکتی ہیں، جس سے ہر ورژن میں چیینجز کو رول بیک اور سمجھنے کو آسان بناتی ہیں۔
  2. خود کار انتشار: مائیگریشن میکانزم کے ذریعہ، ڈیٹا بیس کے انتشار اور اپ ڈیٹس کو خود کار بنایا جا سکتا ہے، جو دستی مداخلت کی ممکنیت اور خطا کے خطرے کو کم کرتا ہے۔
  3. ٹیم اشتراک: مائیگریشن فائلز یہ یقینی بناتی ہیں کہ ٹیم کے ممبرز مختلف ڈویلپمنٹ ماحولوں میں ہم آہنگ ڈیٹا بیس ساخت کا استعمال کرتے ہیں، جو تعاونی ڈویلپمنٹ کو آسان بناتی ہیں۔

1.2 ent فریم ورک کی مائیگریشن خصوصیات

ent فریم ورک کی مائیگریشن میکانزم کا انضمام مندرجہ ذیل خصوصیات فراہم کرتا ہے:

  1. تصریحی پروگرامنگ: ڈویلپر کو صرف اینٹیٹیز کی گو ریپریزنٹیشن پر توجہ دینی ہوتی ہے، اور ent فریم ورک ڈیٹا بیس کی تبدیلی کو اینٹیٹیز سے ڈیٹا بیس ٹیبلز میں تبدیل کر دیتا ہے۔
  2. خود کار مائیگریشن: ent بغیر مینوئل ڈی ڈی یل کے بغیر ڈیٹا بیس ٹیبل ساخت اور اپ ڈیٹ کر سکتا ہے۔
  3. لچکدار کنٹرول: ent مختلف مائیگریشن ضروریات کی حمایت کرنے کے لیے مختلف تشکیلی اختیارات فراہم کرتا ہے، جیسے کہ فارن کی چابی کے ساتھ یا بغیر فارن کی چابی کے اور عالمی طور پر یونیک شناختی شناختی شناخت جنریٹ کرنا۔

2. خود کار مائیگریشن کی تعارف

2.1 خود کار مائیگریشن کی بنیادی اصول

ent فریم ورک کی خود کار مائیگریشن فیچر اسکیما تعریف فائلوں (عموماً ent/schema ڈائریکٹری میں پائی جاتی ہیں) پر مبنی ہوتی ہے تاکہ ڈیٹا بیس ساخت کو جنریٹ کیا جا سکے۔ جب ڈویلپرس اینٹیٹیز اور رشتے تعین کرتے ہیں، تو ent موجودہ ساخت کو جانچتا ہے اور مطابقتی عملیات جیسے کہ ٹیبلز کی تخلیق، کالمز کا اضافہ یا تبدیلی، انڈیکسز کی تخلیق وغیرہ بنانے کے لئے مطابقتی آپریشنس جنریٹ کرتا ہے۔

علاوہ ازیں، ent کی خود کار مائیگریشن کا اصول "ایپنڈ موڈ" پر کام کرتا ہے: یہ بنیادی طور پر صرف نئے ٹیبلز، نئے انڈیکسز یا ٹیبلز میں کالمز جوڑے جاتے ہیں، اور موجودہ ٹیبلز یا کالمز کو نہیں ہٹاتا۔ یہ ڈیزائن کو نقصان کرنے سے بچانے کے لیے فائدہ مند ہے اور ڈیٹا بیس ساخت کو سیدھے طور پر وسیع کرنا آسان بناتا ہے۔

2.2 خود کار مائیگریشن کا استعمال

ent خود کار مائیگریشن کا استعمال کرنے کے بنیادی قدم مندرجہ ذیل ہیں:

package main

import (
    "context"
    "log"
    "ent"
)

func main() {
    client, err := ent.Open("mysql", "root:pass@tcp(localhost:3306)/test")
    if err != nil {
        log.Fatalf("Failed to connect to MySQL: %v", err)
    }
    defer client.Close()
    ctx := context.Background()

    // ڈیٹا بیس سکیما کو بنانے یا اپ ڈیٹ کرنے کے لئے خود کار مائیگریشن کا انجام دیں
    if err := client.Schema.Create(ctx); err != nil {
        log.Fatalf("Failed to create database schema: %v", err)
    }
}

واضح کوڈ میں، ent.Open ڈیٹا بیس کے ساتھ رابطہ قائم کرنے اور ایک کلائنٹ مثال واپس کرنے کے ذمہ دار ہے، جبکہ client.Schema.Create واقعی خود کار مائیگریشن کارروائی کو انجام دیتا ہے۔

3. خود کار مائیگریشن کے ترقیاتی استعمالات

3.1 کالمز اور انڈیکس کا ہٹانا

کچھ صورتوں میں ہمیں ڈیٹا بیس سکیما سے ضرورت سے زیادہ کالمز یا انڈیکسز کو ہٹانا ہوسکتا ہے۔ اس وقت، ہم WithDropColumn اور WithDropIndex اختیارات کا استعمال کرسکتے ہیں۔ مثال کے طور پر:

// اختیارات کے ساتھ مائیگریشن کو چلائیں کالمز اور انڈیکسز کا ہٹانے کے لئے
err = client.Schema.Create(
    ctx,
    migrate.WithDropIndex(true),
    migrate.WithDropColumn(true),
)

اس کوڈ سنیپٹ نے خود کار مائیگریشن کے دوران کالمز اور انڈیکسز کو حذف کرنے کی تشکیلات فراہم کی ہیں۔ ent وقت کے دوران ان مائیگریشن کو اجرا کرتا ہے جب ڈیفائنیشن کا مائیگریشن کرتا ہے۔

3.2 عالمی یونیک شناختی شناخت

عام طور پر، SQL ڈیٹا بیس میں پرائمری کیز ہر ٹیبل کے لیے 1 سے شروع ہوتے ہیں، اور مختلف اینٹیٹی اقسام ایک ہی ID کو شیئر کرسکتے ہیں۔ کچھ ایپلیکیشن سیناریوز میں، مثلاً GraphQL استعمال کرتے ہوئے، مختلف اینٹیٹی اقسام کی اشیائی ID کے لئے عالمی یونیک مینتی چاہیے ہوسکتی ہے۔ ent میں اس کو WithGlobalUniqueID اختیارات کا استعمال کرکے تشکیل دی جا سکتی ہے:

// ہر اینٹیٹی کیلئے یونیورسل یونیک IDs کے ساتھ مائیگریشن کو چلائیں۔
if err := client.Schema.Create(ctx, migrate.WithGlobalUniqueID(true)); err != nil {
    log.Fatalf("Failed to create the database schema: %v", err)
}

WithGlobalUniqueID اوپشن کو فعال کرنے کے بعد، ent ہر اینٹیٹی کو ent_types نام کے ایک 2^32 رینج آئی ڈی کے ساتھ نامزد کرے گا تاکہ عالمی یکروپنس حاصل ہو۔

3.3 آف لائن موڈ

آف لائن موڈ کے ذریعے io.Writer پر سکیما تبدیلیاں لکھنے کی اجازت ہے بجائے کے انہیں ڈیٹا بیس پر فوراً انجام دینے کی۔ یہ اس بابت مفید ہے کہ پراکشت SQL کی مشورہ کرنے سے پہلے یا ایک SQL اسکرپٹ کو ہاتھ سے انجام دینے کے لیے ایک SQL اسکرپٹ تیار کرنے کے لیے۔

// مائیگریشن تبدیلیاں فائل میں ڈمپ کریں
f, err := os.Create("migrate.sql")
if err != nil {
    log.Fatalf("مائیگریشن فائل تیار کرنے میں ناکام: %v", err)
}
defer f.Close()
if err := client.Schema.WriteTo(ctx, f); err != nil {
    log.Fatalf("ڈیٹا بیس سکیما تبدیلیاں چھاپنے میں ناکام: %v", err)
}

اس کوڈ کو "migrate.sql" نام کی فائل میں تبدیلیاں ڈالے گی۔ عمل میں، ڈویلپرز انتخاب کر سکتے ہیں کہ وہ سراسر معیاری خروج پر چھاپیں یا دیکھنے یا ریکارڈ رکھنے کے لیے فائل میں لکھیں۔

4. فارن کی اسپورٹ اور کسٹم ہکس

4.1 فارن کی اسپورٹ کو فعال یا غیر فعال کریں

Ent میں، بہریں کی اسپورٹ موجود ہیں جو کہ ہر جدید انٹٹٹی کے درمیان رشتے (ادجز) کو تعریف کرکے ایمپلیمنٹ ہوتی ہیں اور یہ بہریں کی رشتوں کو ڈیٹا بیس کی سطح پر خودبخود بناتے ہیں تاکہ ڈیٹا کی پارسپکتا اور استقامت کو پابندی سے پورا کرسکیں۔ البتہ، کچھ صورتوں میں، مثلاً کام کی تیزی کے لیے یا جب ڈیٹا بیس بہریں کی اسپورٹ نہیں کرتا ہے، آپ یہ چن سکتے ہیں کہ آپ انہیں غیر فعال کر دیں۔

مائیگریشن میں فارن کی اسپورٹ کو فعال یا غیر فعال کرنے کے لیے آپ WithForeignKeys ترتیب کاری کے ذریعے اس کو کنٹرول کر سکتے ہیں۔

// فارن کی اسپورٹ کو فعال کریں
err = client.Schema.Create(
    ctx,
    migrate.WithForeignKeys(true), 
)
if err != nil {
    log.Fatalf("فارن کی اسپورٹ کے ساتھ سکیما وسائل تخلیق کرنے میں ناکام: %v", err)
}

// فارن کی اسپورٹ کو غیر فعال کریں
err = client.Schema.Create(
    ctx,
    migrate.WithForeignKeys(false), 
)
if err != nil {
    log.Fatalf("فارن کی اسپورٹ کے بغیر سکیما وسائل تخلیق کرنے میں ناکام: %v", err)
}

اس ترتیب کاری کو بلانے کے وقت اس ترتیب کاری کو گزارنا ضروری ہوگا اور یہ فیصلہ کرے گا کہ کیا تخلیق شدہ DDL میں فارن کی پابندیوں کو شامل کیا جائے گا یا نہیں۔

4.2 مائیگریشن ہکس کا استعمال

مائیگریشن ہکس کسٹم منطق ہے جو مائیگریشن کے مختلف مراحل پر داخل اور انجام دیا جاسکتا ہے۔ یہ ڈیٹا بیس کی ایک ایکشن سے پہلے / بعد میں مخصوص منطق کو انجام دینے کے لیے بہت موثر ہیں، جیسے کہ مائیگریشن کے نتائج کی تصدیق کرنا اور ڈیٹا کو پہلے ہی بھرنا۔

یہاں ایک مثال دی گئی ہے کہ کس طرح کسٹم مائیگریشن ہکس کو انجام دیا جاسکتا ہے۔

func customHook(next schema.Creator) schema.Creator {
    return schema.CreateFunc(func(ctx context.Context, tables ...*schema.Table) error {
        // مائیگریشن سے پہلے کسٹم کوڈ کو انجام دینا
        // مثال کے طور پر، لاگنگ، مختلف پوری شرط کی جانچ پڑتال وغیرہ۔
        log.Println("مائیگریشن سے پہلے کسٹم منطق")

        // اگلا ہک یا ڈیفالٹ مائیگریشن منطق کو بلایا جائے
        err := next.Create(ctx, tables...)
        if err != nil {
            return err
        }

        // مائیگریشن کے بعد کسٹم کوڈ کو انجام دینا
        // مثال کے طور پر، صفائی، ڈیٹا مائیگریشن، سیکورٹی چیکس وغیرہ۔
        log.Println("مائیگریشن کے بعد کسٹم منطق")
        return nil
    })
}

// مائیگریشن میں کسٹم ہکس کا استعمال
err := client.Schema.Create(
    ctx,
    schema.WithHooks(customHook),
)
if err != nil {
    log.Fatalf("کسٹم مائیگریشن ہکس کا اطلاق کرنے میں خرابی: %v", err)
}

ہکس مشکل مائیگریشنس کے لیے طاقتور اور بے نظیر ٹولز ہیں، جو آپ کو معقول مائیگریشن کے سسٹم کا انجام دینے کی اجازت دیتے ہیں جب ضرورت ہوتی ہے۔

5. ورشند مائیگریشنز

5.1 ورشند مائیگریشنز کا تعارف

ورشند مائیگریشن، ڈیٹا بیس مائیگریشن کا ایک پیٹرن ہے جو ڈیٹا بیس سچ کو مختلف ورژنز میں تقسیم کرنے کی اجازت دیتا ہے، ہر ایک مخصوص سیٹ کے ڈیٹا بیس ترتیبی کمانڈز شامل ہوتے ہیں۔ آٹو مائیگریشن کے مقابلے میں، ورشند مائیگریشن نے مختلف کنٹرول فراہم کرتا ہے، یعنی ڈیٹا بیس سچ کی تبدیلیاں کے پیچھے چھپائی اور الٹائی جا سکتی ہے۔ جب تیم کے ساتھ کام کرنے کی صورت میں، ورشند مائیگریشن یہ یقینی بناتا ہے کے ہر رکن ایک جیسی ڈیٹا بیس سچ پر کام کرتا ہے، جو عدم استقامت کے باعث پیدا ہونے والے مسائل کو کم کرتا ہے۔

آٹو مائیگریشن عموماً الٹ وقتناہیں ہوتی ہے، جو ایک اینٹٹی ماڈلز کی تازہ ترین حالت کے مطابق فوری SQL فراہم کرتی ہے، ڈویلپمنٹ مراحل یا چھوٹے منصوبوں میں استعمال ہوتی ہے۔

5.2 ورشند مائیگریشن کا استعمال

1. ایٹلس ٹول کا انسٹال کرنا

ورشند مائیگریشنز استعمال کرنے سے پہلے آپ کو اپنے سسٹم پر Atlas ٹول انسٹال کرنا ہوگا۔ Atlas ایک مائیگریشن ٹول ہے جو مختلف ڈیٹا بیس سسٹم کا سپورٹ کرتا ہے، اور ڈیٹا بیس اسکیما تبدیلیوں کو منظم کرنے کے لیے طاقتور خصوصیات فراہم کرتا ہے۔

macOS + Linux

curl -sSf https://atlasgo.sh | sh

Homebrew

brew install ariga/tap/atlas

Docker

docker pull arigaio/atlas
docker run --rm arigaio/atlas --help

Windows

https://release.ariga.io/atlas/atlas-windows-amd64-latest.exe

2. موجودہ اینٹٹی ڈیفنیشنز کے بنیاد پر مائیگریشن فائلز تیار کرنا

atlas migrate diff migration_name \
  --dir "file://ent/migrate/migrations" \
  --to "ent://ent/schema" \
  --dev-url "docker://mysql/8/ent"

3. ایپلیکیشن مائیگریشن فائلز

جب مائیگریشن فائلز تیار ہوجاتی ہیں تو یہاں تک کہ انہیں ڈویلپمنٹ، ٹیسٹنگ یا پراڈکشن ماحولات پر لاگو کیا جا سکتا ہے۔ عام طور پر، آپ پہلے ان مائیگریشن فائلز کو ڈویلپمنٹ یا ٹیسٹنگ ڈیٹا بیس میں لاگو کریں گے تاکہ یہ یقینی بنایا جا سکے کہ یہ متوقع طریقے سے چل رہے ہیں۔ پھر، یہی مائیگریشن اقدامات پراڈکشن ماحول میں بھی انجام دی جائیں گی۔

atlas migrate apply \
  --dir "file://ent/migrate/migrations" \
  --url "mysql://root:pass@localhost:3306/example"

atlas migrate apply کمانڈ استعمال کریں، مائیگریشن فائلوں کا ڈائرکٹری سپیس مختص کریں (--dir) اور ہدف ڈیٹا بیس کا URL بتائیں (--url) تاکہ مائیگریشن فائلز لاگو کیے جا سکیں۔