1. ইন্সটলিং দি এন্ট টুল

এন্ট কোড জেনারেশন টুল ইন্সটল করতে, আপনাকে এই ধাপগুলি অনুসরণ করতে হবে:

প্রথমে, নিশ্চিত করুন যে আপনার সিস্টেমে গো ভাষা এনভায়রনমেন্ট ইন্সটল করা আছে। তারপর, নিম্নলিখিত কমান্ডটি চালান:

go get -d entgo.io/ent/cmd/ent

এই কমান্ডটি অপেক্ষা কর্ম এন্ট টুলের জন্য কোডটি ডাউনলোড করবে, কিন্তু এটি কোডটি কম্পাইল এবং ইন্সটল না করবে। আপনি যদি চান যে আপনি এন্ট টুলকে এন্টও পিয়াথ/বিন ডিরেক্টরিতে ইন্স্টল করে নিয়ে সবযত্নে ব্যবহার করতে পারেন, তাহলে নিম্নলিখিত কমান্ডটি প্রয়োগ করতে হবে:

go install entgo.io/ent/cmd/ent

ইন্সটলেশন শেষ হলে, আপনি যদি যাচাই করতে চান যে এন্ট টুলটি সঠিকভাবে ইন্স্টল করা হয়েছে এবং উপলব্ধ কমান্ড এবং নির্দেশাবলী দেখতে, তাহলে নিম্নলিখিত কমান্ডটি চালান: ent -h

2. স্কিমা ইনিশিয়ালাইজেশন

2.1 ent init ব্যবহার করে টেমপ্লেট ইনিশিয়ালাইজেশন

ent কোড জেনারেশন শুরু করার জন্য একটি নতুন স্কিমা ফাইল তৈরি করা হলেই টাইমলাইনটি। আপনি নিম্নলিখিত কমান্ড প্রয়োগ করে স্কিমা টেমপ্লেট ইনিশিয়ালাইজ করতে পারেন:

go run -mod=mod entgo.io/ent/cmd/ent new User Pet

এই কমান্ডটি দুটি নতুন স্কিমা ফাইল তৈরি করবে: user.go এবং pet.go, এবং এগুলি ent/schema নির্দিষ্টীকরণে রাখবে। যদি ent নির্দিষ্টীকরণ অস্তিত্ব না থাকে, তাহলে এই কমান্ড স্বয়ংক্রিয়ভাবে তা তৈরি করবে। প্রকল্পের মূল নির্দেশিকায় ent init কমান্ড চালানা ভাল অনুশাসন কারে, কারণ এটি প্রকল্প নির্দেশিকার অবস্থা ও স্পষ্টতা বজায় রাখতে সাহায্য করে।

2.2 স্কিমা ফাইল স্ট্রাকচার

ent/schema নির্দিষ্টীকরণে, প্রতিটি স্কিমা একটি গো ভাষার সোর্স ফাইলের সাথে সাংঘাতিক। স্কিমা ফাইলগুলিতে, আপনি ডাটাবেস মডেল সংজ্ঞায়িত করেন, যেমন ফিল্ড এবং এজ (রিলেশনশিপ).

উদাহরণস্বরূপ, user.go ফাইলে, আপনি একটি ব্যবহারকারীর মডেল সংজ্ঞায়িত করতে পারেন, যেখানে ফিল্ডগুলির মধ্যে ব্যবহারকারীর নাম এবং বয়স সহ, এবং ব্যবহারকারীদের এবং পেটস এর মধ্যকার সম্পর্ক সংজ্ঞায়িত করতে পারেন। অনুরূপভাবে, pet.go ফাইলে, আপনি পেটের মডেল সংজ্ঞায়িত করতে পারেন, এবং তার সংশ্লিষ্ট ফিল্ডগুলি যেহেতু, পেটের নাম, প্রকার সহ, এবং পেট এর মাঝের সম্পর্কের সংজ্ঞায়িত করতে পারেন।

এই ফাইলগুলি পরবর্তীতে ent টুল দ্বারা প্রস্তুত গো কোড, ডাটাবেস অপারেশন এবং CRUD (তৈরি, পড়া, আপডেট, মুছে ফেলা) অপারেশনের জন্য ব্যবহৃত হবে।

// ent/schema/user.go
package schema

import (
    "entgo.io/ent"
    "entgo.io/ent/schema/field"
)

// ইউজার এন্টিটির স্কিমা সংজ্ঞায়িত করে।
type User struct {
    ent.Schema
}

// ফিল্ড মেথডটি ব্যবহার হয় এন্টিটির ফিল্ডগুলি সংজ্ঞায়িত করার জন্য।
func (User) Fields() []ent.Field {
    return []ent.Field{
        field.String("name").Unique(),
        field.Int("age").Positive(),
    }
}

// সংপর্ক মেথডেগুলি এন্টিটির সংস্থানাসন নির্ধারণ করার জন্য ব্যবহৃত হয়।
func (User) Edges() []ent.Edge {
    // সংস্থানাসনগুলি পরের অনুখানে বিস্তারিতভাবে ব্যাখ্যা করা হবে।
}

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

3.1 কোড জেনারেশন চালানো

ent ফ্রেমওয়ার্কে কোড জেনারেশন হারিয়ে চালানো, খুব গুরুত্বপূর্ণ একটি ধাপ। এই কমান্ডটি ব্যবহার করে, ent পরবর্তী ডেভেলপমেন্ট কাজগুলির সুবিধা বাধাগুলি মোচন প্রেরণ করা উপেক্ষা করে গো কোড ফাইল জেনারেশন করবে। কোড জেনারেশন চালানোর কমান্ডটি সরল:

go generate ./ent

উপরের কমান্ডটি প্রকল্পের মূল নির্দেশিকায় চালাতে হবে। যখন go generate কল করা হয়, তখন উপযুক্ত এনোটেশনগুলি সম্পদ করা সব গো ফাইলগুলি জুড়ে অনুসন্ধান করবে, এবং এনোটেশনগুলিতে নির্দিষ্ট বর্ণনা করা কমান্ডগুলি প্রয়োগ করবে। আমাদের উদাহরণে, এই কমান্ডটি এন্টের জন্য কোড জেনারেটরকে নির্ধারণ করে।

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

3.2 জেনারেটেড কোড এসেট বুঝা

জেনারেটেড কোড এসেটগুলি বিভিন্ন কার্যকরণ সহ একাধিক কম্পোনেন্ট ধারণ করে:

  • Client এবং Tx অবজেক্টস: ডেটা গ্রাফ সাথে অবস্থান করার জন্য ব্যবহৃত। Client ট্রানজেকশন (Tx) তৈরি করার বা ডেটাবেস অপারেশন সরাসরি সম্পাদন করার জন্য মেথড সরবরাহ করে।

  • CRUD বিল্ডার: প্রতিটি স্কিমা টাইপের জন্য, তা নির্মাণ, পড়ুন, আপডেট, এবং মুছের জন্য বিল্ডার তৈরি করে, যা সংশ্লেষণের লজিক সহজ করে।

  • এন্টিটি অবজেক্ট (Go স্ট্রাক্ট): স্কিমা থাকলে সেইসাথে সেইসাথে টেবিলগুলির জন্য সামঞ্জস্যপূর্ণ Go স্ট্রাক্ট জেনারেট করে।

  • কনস্ট্যান্ট এবং প্রেডিকেটস প্যাকেজ: বিল্ডার সাথে সন্ধানে কনস্ট্যান্ট এবং প্রেডিকেটস রাখে।

  • মাইগ্রেট প্যাকেজ: ডেটাবেস মাইগ্রেশনের জন্য প্যাকেজ, SQL ডায়লেক্ট সাথে মিল।

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

জেনারেটেড কোডগুলির পরীক্ষা করে, আপনি আপনার স্কিমাগুলির জন্য এন্ট ফ্রেমওয়ার্ক যেভাবে ডেটা অ্যাক্সেস কোড অটোমেট করে তা উপলব্ধি করতে পারেন।

4. কোড জেনারেশন অপশন

ent generate কমান্ডটির বিভিন্ন অপশনগুলি সেটাপ এবং কাস্টমাইজ করার জন্য সাপোর্ট করে। আপনি নিম্নলিখিত কমান্ড দ্বারা সমস্যা পূর্বক সমস্যা পূর্বক সমস্যা পূর্বক সমস্যা পূর্বক সমস্যা পূর্বক সমস্যা পূর্বক সমস্যা পূর্বক সমস্যা পূর্বক সমস্যা করা হয়।

ent generate -h

এই অপশনগুলি ব্যবহার করে ডেভেলপাররা বিভিন্ন প্রয়োজন এবং পছন্দনীয়তা অনুযায়ী তাদের কোড জেনারেশন প্রক্রিয়াকে কাস্টমাইজ করতে পারেন।

5. স্টোরেজ অপশন কনফিগারেশন

ent SQL এবং Gremlin ডায়ালেক্টের জন্য প্রস্তুতি কোড এসেট জেনারেট সমর্থন করে, ডিফল্ট হল SQL ডায়ালেক্ট। যদি প্রকল্পটি কোনও Gremlin ডেটাবেসে যুক্ত করা লাগে, তবে প্রয়োজনীয় ডেটাবেস ডায়লেক্টকে কনফিগার করা প্রয়োজন। নিম্নলিখিত ডিমোনস্ট্রেট করে যে উপায়ে স্টোরেজ অপশনগুলি নির্ধারণ করা হয়:

ent generate --storage gremlin ./ent/schema

উপরোক্ত কমান্ডটি ব্যবহার করে ent কে প্রস্তুতি জোগাড় জনাতে। এটি নিশ্চিত করে যে উত্পন্ন এসেটগুলি নির্দিষ্ট গ্রাফ ডাটাবেসের প্রয়োজনীয়তায় মিলিত, এটি যাচাই করে।

6. উন্নত ব্যবহার: entc প্যাকেজ

6.1 প্রজেক্টে entc প্যাকেজ ব্যবহার

entc হল এন্ট ফ্রেমওয়ার্কে কোড জেনারেশনের জন্য ব্যবহৃত কোআর প্যাকেজ। কমান্ড-লাইন শক্তির পাশাপাশি, entc প্যাকেজটি প্রজেক্টে প্যাকেজ হিসাবে সন্নিবেশ করা যেতে পারে, যে দেয়ালা উপর অধীনে কোড জেনারেশন প্রক্রিয়াটি কন্ট্রোল করতে দেয় ডেভেলপারদের।

প্রজেক্টে entc প্যাকেজটি ব্যবহার করার জন্য, আপনার একটি ফাইল তৈরি করতে হবে যের নাম হবে entc.go এবং তার মধ্যে নিম্নোক্ত বিষয় যুক্ত করতে হবে:

// +build ignore

package main

import (
    "log"
    "entgo.io/ent/entc"
    "entgo.io/ent/entc/gen"
)

func main() {
    if err := entc.Generate("./schema", &gen.Config{}); err != nil {
        log.Fatal("running ent codegen:", err)
    }
}

এই উপায়টি ব্যবহার করে আপনি প্রয়োজন মতো বিভিন্ন কনফিগারেশন অপশনগুলি প্রয়োগ করার জন্য মেইন ফাংশনের মধ্যে gen.Config স্ট্রাক্ট সংশোধন করতে পারেন। প্রয়োজন মতো entc.Generate ফাংশনটি কল করে, আপনি প্রয়োজন মতো কোড জেনারেশন প্রক্রিয়া নিয়ন্ত্রণ করতে পারেন।

6.2 entc এর বিস্তারিত কনফিগারেশন

entc বিকল্প নির্ধারণ করার জন্য বৃদ্ধি কারক ময়দাক্ষেপ সরবরাহ করে, যা বিকসিতকৃত কোডগুলির অনুরূপ করার জন্য ডেভেলপারদের অনুমতি দেয়। উদাহরণস্বরূপ, অনুকূলিত হুক কনফিগার করা যেতে পারে যাতে নির্মিত কোডগুলির পরীক্ষা করা বা পরিবर্তন করা যায়, এবং ডিপেন্ডেন্সি ইনজেকশন ব্যবহার করে বাহ্যিক অভিভাবকগণ প্রবেশ করানো যেতে পারে।

নীচের উদাহরণটি দেখায় যেভাবে entc.Generate ফাংশনের জন্য কাস্টম হুক সরবরাহ করা হয়:

func main() {
    err := entc.Generate("./schema", &gen.Config{
        Hooks: []gen.Hook{
            HookFunction,
        },
    })
    if err != nil {
        log.Fatalf("ent কোডজেনারেট করা হচ্ছে না: %v", err)
    }
}

// HookFunction একটি কাস্টম হুক ফাংশন
func HookFunction(next gen.Generator) gen.Generator {
    return gen.GenerateFunc(func(g *gen.Graph) error {
        // এখানে g দ্বারা প্রতিনিধিত্বিত গ্রাফ মোড হ্যান্ডেল করা যায়
        // উদাহরণস্বরূপ, ক্ষেত্রের অস্তিত্ব যাচাই করা বা পরিবর্তন করা
        return next.Generate(g)
    })
}

ছাড়াও, entc.Dependency ব্যবহার করে বাহ্যিক ডিপেন্ডেন্সি সংযোজন করা যেতে পারে:

func main() {
    opts := []entc.Option{
        entc.Dependency(
            entc.DependencyType(&http.Client{}),
        ),
        entc.Dependency(
            entc.DependencyName("Writer"),
            entc.DependencyTypeInfo(&field.TypeInfo{
                Ident:   "io.Writer",
                PkgPath: "io",
            }),
        ),
    }
    if err := entc.Generate("./schema", &gen.Config{}, opts...); err != nil {
        log.Fatalf("ent কোডজেনারেট করা হচ্ছে না: %v", err)
    }
}

এই উদাহরণে, আমরা উত্পন্ন ক্লায়েন্ট অবজেক্টে http.Client এবং io.Writer হিসেবে ডিপেন্ডেন্সি সংযোজন করি।

7. স্কিমা বর্ণনার আউটপুট

ent ফ্রেমওয়ার্কে, ent describe কমান্ডটি ব্যবহার করে স্কিমার স্কিমা এর বিবরণকে গ্রাফিক্যাল রূপে আউটপুট করা যেতে পারে। এটি ডেভেলপারদের দ্রুত বর্তমান এবং সম্পর্কের বোঝা সাহায্য করতে পারে।

নিম্নলিখিত কমান্ডটি সাক্ষাৎ করতে উদাহরণ দেওয়া হয়েছে:

go run -mod=mod entgo.io/ent/cmd/ent describe ./ent/schema

উপরের কমান্ডটি একটি সারণী আউটপুট করবে, যেটি প্রতিটি এন্টিটির ফিল্ড, প্রকার, সম্পর্ক ইত্যাদির মত তথ্য দেখাবে।

User:
    +-------+---------+--------+-----------+ ...
    | Field |  Type   | Unique | Optional  | ...
    +-------+---------+--------+-----------+ ...
    | id    | int     | false  | false     | ...
    | name  | string  | true   | false     | ...
    +-------+---------+--------+-----------+ ...
    +-------+--------+---------+-----------+ ...
    | Edge  |  Type  | Inverse | Relation  | ...
    +-------+--------+---------+-----------+ ...
    | pets  | Pet    | false   | O2M       | ...
    +-------+--------+---------+-----------+ ...

8. কোড জেনারেশন হুক

8.1 হুকের ধারণা

হুকগুলি মিডলওয়্যার ফাংশন, যেগুলি ent এর কোড জেনারেশন প্রসেসে ঢুকিয়ে যেতে পারে, যাতে কাস্টম লজিক প্রস্তুত করা যেতে পারে পূর্বে এবং পরে কোড জেনারেশনের আগে। হুক ব্যবহার করা যেতে পারে জেনারেটেড কোডের অস্ট্র্যাকট ট্রি (AST) পরিবর্তন করতে, অবলোপন করতে বৈধতা পরীক্ষা করতে, বা অতিরিক্ত কোড স্নিপেট যোগ করতে।

8.2 হুক ব্যবহারের উদাহরণ

এখানে একটি উপায় দেখানো হয়েছে যে যাতে নিশ্চিত হতে পারে যেতে সমস্ত ফিল্ডগুলি নির্দিষ্ট বৈশিষ্ট্য ট্যাগ (উদাহরণস্বরূপ, json) ধারণ করে:

func main() {
    err := entc.Generate("./schema", &gen.Config{
        Hooks: []gen.Hook{
            EnsureStructTag("json"),
        },
    })
    if err != nil {
        log.Fatalf("ent কোডজেনারেট করা হচ্ছে না: %v", err)
    }
}

// EnsureStructTag নিশ্চিত করে যে গ্রাফগুলিতে সমস্ত ফিল্ড বিশিষ্ট স্ট্রাকচার ট্যাগ আছে
func EnsureStructTag(name string) gen.Hook {
    return func(next gen.Generator) gen.Generator {
        return gen.GenerateFunc(func(g *gen.Graph) error {
            for _, node := range g.Nodes {
                for _, field := range node.Fields {
                    tag := reflect.StructTag(field.StructTag)
                    if _, ok := tag.Lookup(name); !ok {
                        return fmt.Errorf("ক্ষেত্র %s.%s এর জন্য স্ট্রাকচার ট্যাগ %q অনুপস্থিত", node.Name, field.Name, name)
                    }
                }
            }
            return next.Generate(g)
        })
    }
}

এই উদাহরণে, কোড জেনারেট করার আগে, EnsureStructTag ফাংশনটি প্রতিটি ক্ষেত্রের জন্য json ট্যাগ এবং প্রস্তুতি করে। যদি কোনও ক্ষেত্র এই ট্যাগ অনুপস্থিত হয়, তবে কোড জেনারেশন বন্ধ হবে এবং একটি ত্রুটি রিটার্ন করা হবে। এটি একটি দক্ষিণতা বজায় রাখার একটি কর্মকর উপায়।