1. मॉडल और फ़ील्ड की मूल जानकारी

1.1. मॉडल परिभाषा का परिचय

ORM framework में, एक मॉडल का उपयोग ऐप्लिकेशन और डेटाबेस तालिकाओं में एन्टिटी प्रकार के मैपिंग संबंध का विवरण करने के लिए किया जाता है। मॉडल ने एन्टिटी की गुणवत्ता और संबंधों को परिभाषित किया है, साथ ही उनके साथ जुड़े डेटाबेस-विशिष्ट कॉन्फ़िगरेशन को। एंट फ्रेमवर्क में, मॉडल आमतौर पर एन्टिटी प्रकारों को ग्राफ में वर्णित करने के लिए प्रयोग होते हैं, जैसे कि User या Group.

मॉडल परिभाषाएँ आमतौर पर एन्टिटी के फ़ील्डों (या गुणवत्ताओं) और एजेस (या संबंध) की विवरणों, साथ ही कुछ डेटाबेस-विशिष्ट विकल्पों को शामिल करती हैं। इन विवरणों से हम निर्माण, गुणवत्ताएँ, और एन्टिटी के संबंधों की संरचना को परिभाषित करने में सहायता प्राप्त कर सकते हैं, और मॉडल के आधार पर संबंधित डेटाबेस तालिका संरचना उत्पन्न करने का उपयोग कर सकते हैं।

1.2. फ़ील्ड की अवलोकन

फ़ील्ड मॉडल का वह भाग होता है जो एन्टिटी गुणवत्ताओं को प्रतिनिधित्व करता है। ये एन्टिटी की गुणवत्ताएँ परिभाषित करते हैं, जैसे कि नाम, उम्र, तारीख आदि। एंट फ्रेमवर्क में, फ़ील्ड प्रकार में विभिन्न मूल डेटा प्रकार शामिल हैं, जैसे कि integer, string, boolean, time आदि, साथ ही कुछ SQL-विशिष्ट प्रकार भी शामिल हैं, जैसे कि UUID, []byte, JSON आदि।

नीचे दिए गए सारणी में एंट फ्रेमवर्क द्वारा समर्थित फ़ील्ड प्रकारों को दिखाया गया है:

प्रकार विवरण
int पूर्णांक प्रकार
uint8 8-बिट अविवाहित पूर्णांक प्रकार
float64 फ़्लोटिंग पॉइंट प्रकार
bool बूलियन प्रकार
string स्ट्रिंग प्रकार
time.Time समय प्रकार
UUID यूनिक यूनिवर्सल आईडेंटिफायर (UUID) प्रकार
[]byte बाइट एरे प्रकार (केवल SQL)
JSON JSON प्रकार (केवल SQL)
Enum ऐनुम प्रकार (केवल SQL)
Other अन्य प्रकार (जैसे, पोस्ट्ग्रेस रेंज)

2. फ़ील्ड गुणवत्ता विवरण

2.1. डेटा प्रकार

एक एन्टिटी मॉडल में एट्रिब्यूट या फ़ील्ड का डेटा प्रकार डालने वाले डेटा के रूप को तय करता है। यह एंट फ्रेमवर्क में मॉडल परिभाषा का एक महत्वपूर्ण हिस्सा है। नीचे ent फ्रेमवर्क में कुछ सामान्य डेटा प्रकार दिए गए हैं।

import (
    "time"

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

// User स्कीमा।
type User struct {
    ent.Schema
}

// User के फ़ील्ड।
func (User) Fields() []ent.Field {
    return []ent.Field{
        field.Int("age"),             // पूर्णांक प्रकार
        field.String("name"),         // स्ट्रिंग प्रकार
        field.Bool("active"),         // बूलियन प्रकार
        field.Float("score"),         // फ़्लोटिंग पॉइंट प्रकार
        field.Time("created_at"),     // समय-चिह्न प्रकार
    }
}
  • int: पूर्णांक मानों को प्रतिष्ठित करता है, जो int8, int16, int32, int64, आदि हो सकते हैं।
  • string: स्ट्रिंग डेटा का प्रतिनिधित्व करता है।
  • bool: बूलियन मानों का प्रतिष्ठित करता है, जिसे सामान्यतः फ़्लैग के रूप में उपयोग किया जाता है।
  • float64: फ़्लोटिंग पॉइंट संख्याएँ प्रतिनिधित करता है, इसमें float32 भी उपयोग किया जा सकता है।
  • time.Time: समय को प्रतिष्ठित करता है, जिसे सामान्यतः टाइमस्टैम्प या तारीख डेटा के लिए उपयोग किया जाता है।

इन फ़ील्ड प्रकारों को मूलतः डेटाबेस द्धारा समर्थित प्रकारों से मैप किया जाएगा। साथ ही, ent ने UUID, JSON, ऐनुम (Enum) जैसे अधिक जटिल प्रकारों का समर्थन किया है, और []byte (केवल SQL) और Other (केवल SQL) जैसे विशेष डेटाबेस प्रकारों का समर्थन करता है।

2.2. डिफ़ॉल्ट मान

फ़ील्ड को डिफ़ॉल्ट मानों के साथ कॉन्फ़िगर किया जा सकता है। यदि एक एन्टिटी बनाते समय संबंधित मान निर्दिष्ट नहीं किया गया है, तो डिफ़ॉल्ट मान का उपयोग किया जाएगा। डिफ़ॉल्ट मान एक स्थिर मान या एक फ़ंक्शन से डायनीमिक रूप से उत्पन्न मान हो सकता है। स्थैतिक डिफ़ॉल्ट मान सेट करने के लिए .Default विधि का उपयोग करें, या एक डायनेमिक रूप से उत्पन्न डिफ़ॉल्ट मान सेट करने के लिए .DefaultFunc का उपयोग करें।

// User स्कीमा।
func (User) Fields() []ent.Field {
    return []ent.Field{
        field.Time("created_at").
            Default(time.Now),  // time.Now का एक स्थिर डिफ़ॉल्ट मान
        field.String("role").
            Default("user"),   // एक स्थायी स्ट्रिंग मान
        field.Float("score").
            DefaultFunc(func() float64 {
                return 10.0  // एक फ़ंक्शन द्वारा उत्पन्न डिफ़ॉल्ट मान
            }),
    }
}

2.3. फ़ील्ड की वैकल्पिकता और शून्य मान

डिफ़ॉल्ट रूप से, फील्ड अनिवार्य होते हैं। एक वैकल्पिक फ़ील्ड की घोषणा करने के लिए, .Optional() मेथड का उपयोग करें। वैकल्पिक फ़ील्ड डेटाबेस में अनिवार्य फ़ील्ड के रूप में घोषित किए जाएंगे। Nillable विकल्प फ़ील्डों को 'nil' के रूप में स्पष्ट रूप से सेट करने देता है, जो एक फ़ील्ड के शून्य मान और एक अनसेट स्थिति के बीच भेद करता है।

// उपयोगकर्ता स्कीमा।
func (User) Fields() []ent.Field {
    return []ent.Field{
        field.String("nickname").Optional(), // वैकल्पिक फ़ील्ड की आवश्यकता नहीं है
        field.Int("age").Optional().Nillable(), // Nillable फ़ील्ड 'nil' को सेट करने के लिए
    }
}

ऊपर निर्धारित मॉडल का उपयोग करते समय, age फ़ील्ड 'nil' मान से भी स्वीकार कर सकता है, साथ ही 'nil' जूनू महत्वबूत है।

2.4. फ़ील्ड अनुपलब्धता

यूनिक फ़ील्ड सुनिश्चित करते हैं कि डेटाबेस तालिका में कोई डुप्लिकेट मान नहीं होते हैं। यूनिक फ़ील्ड की परिभाषा के लिए Unique() मेथड का उपयोग करें। जब डेटा अखंडता को एक महत्त्वपूर्ण आवश्यकता के रूप में स्थापित किया जाता है, जैसे उपयोगकर्ता ईमेल या उपयोगकर्ता नाम, तो यूनिक फ़ील्ड का उपयोग करना चाहिए।

// उपयोगकर्ता स्कीमा।
func (User) Fields() []ent.Field {
    return []ent.Field{
        field.String("email").Unique(),  // डुप्लिकेट ईमेल पतों से बचने के लिए यूनिक फ़ील्ड
    }
}

इससे डेटाबेस में एक यूनिक बाध्यता बनाई जाएगी जो डुप्लिकेट मानों का प्रवेश रोकेगी।

2.5. फ़ील्ड सूचीकरण

फील्ड सूचीकरण डेटाबेस क्वेरी के प्रदर्शन को बेहतर बनाने के लिए उपयोग किया जाता है, विशेषकर बड़े डेटाबेसों में। ent फ्रेमवर्क में, .Indexes() मेथड का उपयोग इंडेक्स बनाने के लिए किया जा सकता है।

import "entgo.io/ent/schema/index"

// उपयोगकर्ता स्कीमा।
func (User) Indexes() []ent.Index {
    return []ent.Index{
        index.Fields("email"),  // 'ईमेल' फ़ील्ड पर एक इंडेक्स बनाएं
        index.Fields("name", "age").Unique(), // एक अद्वितीय संयोजक इंडेक्स बनाएं
    }
}

इंडेक्स सक्रिय फ़ील्डों के लिए का उपयोग किया जा सकता है, लेकिन यह ध्यान देने योग्य है कि बहुत से इंडेक्स लिखने के कारण लेखन संचालन प्रदर्शन में कमी हो सकती है। इसलिए, वास्तविक परिस्थितियों पर आधारित रूप से इंडेक्स बनाने का निर्णय संतुलित होना चाहिए।

2.6. कस्टम टैग

ent फ्रेमवर्क में, आप उत्पन्न एंटिटी स्ट्रक्चर के फील्डों में कस्टम टैग जोड़ने के लिए StructTag मेथड का उपयोग कर सकते हैं। ये टैग जूनो इम्प्लीमेंटेसन जैसे JSON इंकोडिंग और XML इंकोडिंग के लिए बहुत उपयोगी होते हैं। नीचे दिए गए उदाहरण में, हम name फ़ील्ड के लिए कस्टम JSON और XML टैग जोड़ेंगे।

// उपयोगकर्ता के फ़ील्ड्स।
func (User) Fields() []ent.Field {
    return []ent.Field{
        field.String("name").
            // StructTag मेथड का उपयोग करके कस्टम टैग जोड़ें
            // यहां, नाम फ़ील्ड के लिए JSON टैग को 'उपयोगकर्ता नाम' सेट करें और जब फ़ील्ड खाली हो (omitempty), तो उसे अनदेखा करें
            // इसके अलावा, कोडिंग के लिए एक्सएमएल टैग को 'नाम' सेट करें
            StructTag(`json:"उपयोगकर्ता नाम,omitempty" xml:"नाम"`),
    }
}

जब JSON या XML कोडिंग के साथ इस्तेमाल किया जाएगा, omitempty विकल्प इस बात का संकेत देता है कि यदि नाम फ़ील्ड खाली है, तो इस फ़ील्ड को कोडिंग परिणाम से छोड़ दिया जाएगा। यह API लिखते समय प्रतिक्रिया शरीर के आकार को कम करने के लिए बहुत उपयोगी है।

इससे यह भी साबित होता है कि एक ही फ़ील्ड के लिए एक साथ कई टैग सेट करने का तरीका है। JSON टैग json कुंजी का प्रयोग करते हैं, XML टैग xml कुंजी का प्रयोग करते हैं, और इन्हें अंतरिक्षों से अलग किया जाता है। जब संरचना कोडिंग या डिकोडिंग के लिए करते हैं, तो इन टैग कोडिंग/डिकोडिंग के लिए encoding/json और encoding/xml जैसे पुस्तकालय कार्यों द्वारा प्रयोग किए जाएंगे।

3. फ़ील्ड मान्यता और परिबंधन

फ़ील्ड मान्यता डेटाबेस डिज़ाइन का एक महत्वपूर्ण पहलू है जो एंटिटी मॉडल में डेटा संरचना और वैधता का सुनिश्चय करता है। इस खंड में, हम इस्तेमाल होने वाले इंटीग्रेटेड मान्यकर्ताओं, कस्टम मान्यकर्ताओं, और विभिन्न प्रतिबंधों पर गहराई से विचार करेंगे।

3.1. बिल्ट-इन वैधाताओं

प्लेटफ़ॉर्म डिफ़ॉल्ट रूप से विभिन्न प्रकार के फ़ील्ड की सामान्य डेटा सत्यता जांच के लिए विभिन्न बिल्ट-इन वैधाता प्रदान करता है। इन बिल्ट-इन वैधाताओं का उपयोग करने से विकास प्रक्रिया सरल हो जाती है और फ़ील्ड के लिए मान्य डेटा सीमाएँ या प्रारूपों को तेजी से परिभाषित किया जा सकता है।

यहां कुछ बिल्ट-इन फ़ील्ड वैधाता के उदाहरण हैं:

  • संख्यात्मक प्रकार के लिए वैधाता:
    • Positive(): यह याद करता है कि फ़ील्ड का मान एक सकारात्मक संख्या है या नहीं।
    • Negative(): यह याद करता है कि फ़ील्ड का मान एक नकारात्मक संख्या है या नहीं।
    • NonNegative(): यह याद करता है कि फ़ील्ड का मान एक नन-नेगेटिव संख्या है या नहीं।
    • Min(i): यह याद करता है कि फ़ील्ड का मान दिए गए न्यूनतम मूल्य i से अधिक है या नहीं।
    • Max(i): यह याद करता है कि फ़ील्ड का मान दिए गए अधिकतम मूल्य i से कम है या नहीं।
  • string प्रकार के लिए वैधाता:
    • MinLen(i): स्ट्रिंग की न्यूनतम लंबाई की जांच करता है।
    • MaxLen(i): स्ट्रिंग की अधिकतम लंबाई की जांच करता है।
    • Match(regexp.Regexp): यह याद करता है कि स्ट्रिंग दिए गए नियमित अभिव्यक्ति से मेल खाता है या नहीं।
    • NotEmpty: यह याद करता है कि स्ट्रिंग खाली नहीं है।

चलो, एक व्यावसायिक कोड उदाहरण देखते हैं। इस उदाहरण में, एक User मॉडल बनाया गया है, जिसमें एक नॉन-नेगेटिव पूर्णांक प्रकार का age फ़ील्ड और एक निर्धारित प्रारूप वाला email फ़ील्ड शामिल है:

func (User) Fields() []ent.Field {
    return []ent.Field{
        field.Int("age").
            Positive(),
        field.String("email").
            Match(regexp.MustCompile(`^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$`)),
    }
}

3.2. कस्टम वैधाताएँ

हालांकि बिल्ट-इन वैधाताओं से बहुत सारी सामान्य वैधाता आवश्यकताएँ संभाली जा सकती हैं, कभी-कभी आपको अधिक जटिल वैधाता तर्क वाले विशेष व्यवसायिक नियमों को पूरा करने के लिए कस्टम वैधाता लिखने की आवश्यकता हो सकती है।

कस्टम वैधाता एक फ़ंक्शन होती है जो एक फ़ील्ड मान को ग्रहण करती है और एक error लौटाती है। अगर लौटाया गया error खाली नहीं है, तो इससे प्रमाणीकरण विफलता का संकेत होता है। कस्टम वैधाता का सामान्य प्रारूप निम्नलिखित है:

func (User) Fields() []ent.Field {
    return []ent.Field{
        field.String("phone").
            Validate(func(s string) error {
                // यह सत्यापित करें कि फ़ोन नंबर अपेक्षित प्रारूप में है या नहीं
                matched, _ := regexp.MatchString(`^\+?[1-9]\d{1,14}$`, s)
                if !matched {
                    return errors.New("गलत फ़ोन नंबर प्रारूप")
                }
                return nil
            }),
    }
}

जैसा कि ऊपर दिखाया गया है, हमने फ़ोन नंबर के प्रारूप की प्रमाणीकरण करने के लिए एक कस्टम वैधाता बनाया है।

3.3. प्रतिबंध

प्रतिबंध विशिष्ट नियमों को डेटाबेस ऑब्ज