डेटा डालना और बल्क डेटा ऑपरेशन करना

Firebase Data Connect में, एक साथ कई डेटा लोड और अपडेट किए जा सकते हैं. इसके लिए, अपने वर्कफ़्लो और एनवायरमेंट के हिसाब से अलग-अलग तरीके अपनाए जा सकते हैं:

  • लोकल प्रोटोटाइपिंग में, जब वैकल्पिक स्कीमा आज़माए जा रहे हों, तब डेटा सीडिंग म्यूटेशन बनाए जा सकते हैं. साथ ही, इन्हें VS Code एक्सटेंशन, Data Connect एम्युलेटर, और लोकल डेटाबेस इंस्टेंस का इस्तेमाल करके, लोकल डेवलपमेंट एनवायरमेंट में कॉल किया जा सकता है.

  • प्रोडक्शन डेवलपमेंट में, स्टेबल स्कीमा के साथ, बड़े CI/CD फ़्लो को लागू करने और प्रोडक्शन डेटा को मैनेज करने के लिए, आपके पास दो विकल्प होते हैं:

    • हमारा सुझाव है कि आप Firebase Admin SDK का इस्तेमाल करें. यह एक लाइब्रेरी है, जो खास एनवायरमेंट में काम करती है.

    • Cloud SQL इंस्टेंस के साथ SQL टूल का इस्तेमाल करके, एक साथ कई फ़ाइलें लोड की जा सकती हैं और अपडेट किए जा सकते हैं. हालांकि, ऐसा सिर्फ़ तब किया जा सकता है, जब डेटा में बदलाव किया जा रहा हो, न कि डेटाबेस स्कीमा में. SQL टूल की मदद से, सीधे डेटाबेस स्कीमा में बदलाव करने से, आपके Data Connect स्कीमा और कनेक्टर काम नहीं कर सकते.

लोकल प्रोटोटाइपिंग: लोकल इंस्टेंस में सीड डेटा

शुरू करने के लिए गाइड में, आपने एक ऐप्लिकेशन सेट अप किया था. इससे ऐड-हॉक इंसर्ट म्यूटेशन का इस्तेमाल करके, किसी एक टेबल में एक रिकॉर्ड जोड़ा जा सकता है.

मूवी की समीक्षा करने वाले ऐप्लिकेशन का इस्तेमाल करने के लिए, उसे मूवी, समीक्षाओं, और उपयोगकर्ताओं के डेटा की ज़रूरत होती है. ऐसा इसलिए, ताकि वह प्रोटोटाइपिंग क्वेरी और म्यूटेशन के लिए, जॉइन और अन्य कार्रवाइयों का इस्तेमाल कर सके. ये कार्रवाइयां, कई टेबल पर असली डेटा के साथ की जाती हैं. अपने स्कीमा को बड़ा किया जा सकता है और अपने डेटाबेस को सीड किया जा सकता है.

डेटा सीडिंग के लिए, आपके प्रोटोटाइपिंग एनवायरमेंट में कोड होना ज़रूरी है. इस गाइड में कुछ सैंपल दिए गए हैं. इनसे यह पता चलता है कि:

  • अलग-अलग टेबल पर _insertMany और _upsertMany का इस्तेमाल करना
  • मिलती-जुलती टेबल पर _insertMany का इस्तेमाल

मूवी की समीक्षा करने वाले ऐप्लिकेशन के स्कीमा को अपडेट करना

_insertMany और _upsertMany म्यूटेशन का इस्तेमाल करके, एक बार में एक डेटाबेस टेबल को अपडेट किया जा सकता है. इसके अलावा, जॉइन रिलेशनशिप से जुड़ी कई टेबल को भी अपडेट किया जा सकता है. नीचे, फ़िल्म की समीक्षा करने वाले ऐप्लिकेशन के बड़े किए गए स्कीमा का उदाहरण दिया गया है. इससे इन इस्तेमाल के उदाहरणों और मामलों को समझने में मदद मिलती है. यह schema.gql को Movie टाइप से आगे बढ़ाता है, ताकि इसमें Actor और MovieActor टाइप शामिल किए जा सकें. इससे हम ज़्यादा जटिल क्वेरी का प्रोटोटाइप बना सकते हैं.

# Actors
# Suppose an actor can participate in multiple movies and movies can have multiple actors
# Movie - Actors (or vice versa) is a many to many relationship
type Actor @table {
  id: UUID!
  imageUrl: String! 
  name: String! @col(name: "name", dataType: "varchar(30)")
}

# Join table for many-to-many relationship for movies and actors
# The 'key' param signifies the primary key(s) of this table
# In this case, the keys are [movieId, actorId], the generated fields of the reference types [movie, actor]
type MovieActor @table(key: ["movie", "actor"]) {
  # @ref creates a field in the current table (MovieActor) that holds the primary key of the referenced type
  # In this case, @ref(fields: "movieId", references: "id") is implied
  movie: Movie!
  # movieId: UUID! <- this is created by the implied @ref
  actor: Actor!
  # actorId: UUID! <- this is created by the implied @ref
  role: String! # "main" or "supporting"
}

ज़ीरो स्टेट डेटा को सीड करने के लिए म्यूटेशन लिखना

प्रोटोटाइपिंग के दौरान, जब आपकी क्वेरी और म्यूटेशन को अलग-अलग वैल्यू की रेंज के हिसाब से टेस्ट करने की ज़रूरत होती है, तब डेटा में कई रिकॉर्ड जोड़े जा सकते हैं. उदाहरण के लिए, आपको तुलना करने और फ़िल्टर करने की सुविधा को आज़माने के लिए, अलग-अलग तरह की शैलियों और रेटिंग वाले कई मूवी रिकॉर्ड जोड़ने पड़ सकते हैं.

Movie और Actor टेबल में सीड डेटा डालना

प्रोटोटाइपिंग के चरण के आधार पर, एक या दो रिकॉर्ड डालने के लिए, शुरू करने से जुड़ी गाइड में बताई गई तकनीक का इस्तेमाल किया जा सकता है. इसका मतलब है कि VS Code एक्सटेंशन में CodeLenses का इस्तेमाल करके, _insert म्यूटेशन बनाए जा सकते हैं, डेटा को हार्ड-कोड किया जा सकता है, और VS Code में उन म्यूटेशन को चलाया जा सकता है.

इसलिए, _insertMany ऑपरेशन का इस्तेमाल करके, टेबल में कई रिकॉर्ड जोड़ने का विकल्प बेहतर होता है. फ़िल्म की समीक्षा करने वाले ऐप्लिकेशन के उदाहरण में, यह Movie और Actor में डेटा का शुरुआती सेट डालता है.

VS Code Firebase एक्सटेंशन का इस्तेमाल करके, यहां दिए गए म्यूटेशन लागू करने के लिए, फ़ाइल एडिटर के सही व्यू में, Run (Production) या Run (Local) CodeLens बटन पर क्लिक करें. यह इस बात पर निर्भर करता है कि आपको प्रोडक्शन सेवा या लोकल डेटाबेस के साथ प्रोटोटाइप बनाना है.

# insertMany for Movie
# 2 records shown
mutation {
  movie_insertMany(data: [
    {
      id: "550e8400-e29b-41d4-a716-446655440000",
      title: "Inception",
      imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/movies%2Finception.jpg?alt=media&token=07b09781-b302-4623-a5c3-1956d0143168",
      genre: "sci-fi",
    },
    {
      id: "550e8400-e29b-41d4-a716-446655440001",
      title: "The Matrix",
      imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/movies%2Fthe_matrix.jpg?alt=media&token=4975645d-fef8-409e-84a5-bcc1046e2059",
      genre: "action",
    }
  ])
}
# insertMany for Actor
# 2 records shown
mutation {
  actor_insertMany(data: [
    {
      id: "123e4567-e89b-12d3-a456-426614174000",
      imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/actors%2Fdicaprio.jpeg?alt=media&token=452e030a-efa5-4ef4-bb81-502b23241316",
      name: "Leonardo DiCaprio"
    },
    {
      id: "123e4567-e89b-12d3-a456-426614174001",
      imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/actors%2Fkeanu.jpg?alt=media&token=6056520c-ef3e-4823-aad0-108aab163115",
      name: "Keanu Reeves"
    }
   ])
}

MovieActor जॉइन टेबल में सीड डेटा

जॉइन और अन्य मुश्किल कार्रवाइयों का इस्तेमाल करके क्वेरी और म्यूटेशन को टेस्ट करने के लिए, MovieActor टेबल में एक से ज़्यादा रिकॉर्ड जोड़े जा सकते हैं.

यहां, इस तरह के संबंध वाली कई टेबल अपडेट करते समय, @transaction डायरेक्टिव जोड़ा जा सकता है. इससे यह पक्का किया जा सकता है कि अपडेट सही तरीके से पूरा हो.

mutation @transaction {
  movie_insertMany(data: [
    {
      id: "550e8400-e29b-41d4-a716-446655440000",
      title: "Inception",
      imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/movies%2Finception.jpg?alt=media&token=07b09781-b302-4623-a5c3-1956d0143168",
      genre: "sci-fi",
    },
    {
      id: "550e8400-e29b-41d4-a716-446655440001",
      title: "The Matrix",
      imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/movies%2Fthe_matrix.jpg?alt=media&token=4975645d-fef8-409e-84a5-bcc1046e2059",
      genre: "action",
    }
  ])

  actor_insertMany(data: [
    {
      id: "123e4567-e89b-12d3-a456-426614174000",
      imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/actors%2Fdicaprio.jpeg?alt=media&token=452e030a-efa5-4ef4-bb81-502b23241316",
      name: "Leonardo DiCaprio"
    },
    {
      id: "123e4567-e89b-12d3-a456-426614174001",
      imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/actors%2Fkeanu.jpg?alt=media&token=6056520c-ef3e-4823-aad0-108aab163115",
      name: "Keanu Reeves"
    }
  ])
}

सीड डेटा को रीसेट करने के लिए म्यूटेशन लिखना

प्रोटोटाइपिंग और सीआई/सीडी करते समय, डेटा को रीसेट करके शून्य पर सेट करना फ़ायदेमंद हो सकता है. इससे नए डेटा सेट पर नई सीरीज़ के टेस्ट किए जा सकते हैं.

इसके लिए, अगर आपका प्रोटोटाइप कोड आपकी टेबल में रिकॉर्ड नहीं जोड़ता है, तो Data Connect की ओर से उपलब्ध कराए गए _upsertMany म्यूटेशन का इस्तेमाल करें.

यहां दिए गए उदाहरण में, फ़िल्म के रिकॉर्ड को उनकी मूल स्थिति में अपडेट करने के लिए, movie_upsertMany को शुरुआती वैल्यू के साथ कॉल किया गया है.

mutation {
  # Execute an upsertMany operation to update the Movie table
  movie_upsertMany(data: [
    {
      id: "550e8400-e29b-41d4-a716-446655440000",
      title: "Inception",
      imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/movies%2Finception.jpg?alt=media&token=07b09781-b302-4623-a5c3-1956d0143168",
      genre: "sci-fi",
    },
    {
      id: "550e8400-e29b-41d4-a716-446655440001",
      title: "The Matrix",
      imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/movies%2Fthe_matrix.jpg?alt=media&token=4975645d-fef8-409e-84a5-bcc1046e2059",
      genre: "action",
    }
   
}

प्रोडक्शन डेवलपमेंट: जानकारी भरने और उसे अपडेट करने के लिए, Admin SDK का इस्तेमाल करें

Firebase Admin SDK का इस्तेमाल तब किया जा सकता है, जब आपको खास एनवायरमेंट में काम करना हो. यह इस्तेमाल का एक अहम उदाहरण है. ऐसा तब होता है, जब आपको हज़ारों रिकॉर्ड लोड करने हों. ऐसा इसलिए, क्योंकि आपके प्रोडक्शन डेटा पर बल्क डेटा ऑपरेशन काफ़ी अहम होते हैं.

Firebase Admin SDK इंस्टॉल करना

अगर आपका काम मुख्य रूप से स्थानीय स्तर पर होता है, तो भी Firebase, Admin SDK को सेट अप करने का सुझाव देता है. इससे आपको अपने स्थानीय एनवायरमेंट के साथ-साथ, खास एनवायरमेंट से भी Firebase Data Connect का इस्तेमाल करने की सुविधा मिलती है. आपको Node.js के लिए Admin SDK सेट अप करना होगा.

Admin SDK को अन्य Data Connectइस्तेमाल के उदाहरणों में इस्तेमाल करने के बारे में ज़्यादा जानें.

प्रोडक्शन डेटा को एक साथ कई बार लोड और अपडेट करना

डेटा को एक साथ मैनेज करने के लिए उपलब्ध एपीआई, आपकी ओर से GraphQL म्यूटेशन बनाता है. इसके बजाय, यह आपसे mutation {...} स्ट्रिंग बनाने के लिए कहता है. इसके लिए, यह executeGraphQL एपीआई का इस्तेमाल करता है. इस एपीआई के बारे में पहले बताया गया था. इसका इस्तेमाल, स्थानीय तौर पर कुछ पंक्तियां जोड़ने के लिए किया जाता है.

एडमिन एपीआई का एक मुख्य फ़ायदा यह है कि इससे CI/CD फ़्लो के लिए, डेटा के ऐरे को अलग-अलग मैनेज किया जा सकता है और उनका फिर से इस्तेमाल किया जा सकता है. इसके अलावा, इससे प्रोडक्शन डेटा के लिए, बड़ी संख्या में डेटा फ़ाइलें सेट अप की जा सकती हैं.

यहां दिए गए स्निपेट में, एक साथ कई डेटा सोर्स के लिए स्क्रिप्ट सेट अप करने का तरीका बताया गया है.

import { initializeApp } from 'firebase-admin/app';
import { getDataConnect } from 'firebase-admin/data-connect';

const app = initializeApp();

const dc = getDataConnect({ location: "us-west2", serviceId: "my-service" });

const data = [
 {
      id: "550e8400-e29b-41d4-a716-446655440000",
      title: "Inception",
      imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/movies%2Finception.jpg?alt=media&token=07b09781-b302-4623-a5c3-1956d0143168",
      genre: "sci-fi",
  },
  {
      id: "550e8400-e29b-41d4-a716-446655440001",
      title: "The Matrix",
      imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/movies%2Fthe_matrix.jpg?alt=media&token=4975645d-fef8-409e-84a5-bcc1046e2059",
      genre: "action",
    }
];

// Methods of the bulk operations API
const resp = await dc.insert("movie" /*table name*/, data[0]);
// Or
const resp = await dc.insertMany("movie" /*table name*/, data);

// Or
const resp = await dc.upsert("movie" /*table name*/, data[0]);
// Or
const resp = await dc.upsertMany("movie" /*table name*/, data);

प्रोडक्शन डेवलपमेंट: डेटा को एक साथ अपडेट करने के लिए, एसक्यूएल का इस्तेमाल करें

अगर प्रोडक्शन में स्टेबल स्कीमा का इस्तेमाल किया जा रहा है और उसमें कोई बदलाव नहीं किया जा रहा है, तो डेटा लोड और अपडेट मैनेज करने के लिए, Cloud SQL इंस्टेंस का इस्तेमाल किया जा सकता है.

डेटा इंपोर्ट करने के लिए, Cloud SQL for PostgreSQL की गाइड देखें.

आगे क्या करना है?