Firebase SQL Connect में, अपने वर्कफ़्लो और एनवायरमेंट के हिसाब से, बल्क में डेटा लोड और अपडेट किया जा सकता है:
लोकल प्रोटोटाइपिंग में, जब अलग-अलग स्कीमा आज़माए जाते हैं, तब डेटा सीडिंग म्यूटेशन SQL Connect VS Code एक्सटेंशन, SQL Connect एम्युलेटर, और लोकल डेटाबेस इंस्टेंस का इस्तेमाल करके, लोकल डेवलपमेंट एनवायरमेंट में बनाए और कॉल किए जा सकते हैं.
प्रोडक्शन डेवलपमेंट में, स्टेबल स्कीमा के साथ, जब बड़े CI/CD फ़्लो किए जाते हैं और प्रोडक्शन डेटा मैनेज किया जाता है, तब आपके पास दो विकल्प होते हैं:
पहला विकल्प है, Firebase Admin SDK का इस्तेमाल करना. यह लाइब्रेरी का एक सेट है जो खास एनवायरमेंट में काम करता है.
आप अपने Cloud SQL इंस्टेंस के साथ SQL टूल का इस्तेमाल करके, बल्क में डेटा लोड और अपडेट भी कर सकते हैं. हालांकि, ऐसा तब ही किया जा सकता है, जब आप डेटा में बदलाव कर रहे हों, न कि अपने डेटाबेस स्कीमा में. SQL टूल की मदद से, डेटाबेस स्कीमा में सीधे बदलाव करने पर, SQL 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 टेबल में डेटा सीड करना
प्रोटोटाइपिंग के चरण के हिसाब से, एक या दो रिकॉर्ड डालने के लिए, शुरू करने के लिए गाइड में बताई गई तकनीक
का इस्तेमाल किया जा सकता है. इसका मतलब है कि _insert म्यूटेशन बनाने,
डेटा को हार्ड-कोड करने, और रन करने के लिए, SQL Connect VS Code एक्सटेंशन में CodeLenses का इस्तेमाल किया जा सकता है.
आखिरकार,
_insertMany कार्रवाई का इस्तेमाल करके, किसी टेबल में कई रिकॉर्ड जोड़ना ज़्यादा सही होता है. मूवी की समीक्षा करने वाले ऐप्लिकेशन के उदाहरण में, इससे Movie और Actor में डेटा का शुरुआती सेट डाला जाता है.
SQL Connect VS Code एक्सटेंशन का इस्तेमाल करके, यहां दिए गए म्यूटेशन को लागू करने के लिए, फ़ाइल एडिटर के सही व्यू में, रन करें (प्रोडक्शन) या रन करें (लोकल) 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"
}
])
}
नेस्ट की गई कार्रवाइयों का इस्तेमाल करके, मिलती-जुलती टेबल में डेटा सीड करना
मिलती-जुलती टेबल में एटॉमिक तरीके से डेटा सीड करने के लिए, लिटरल पेलोड का इस्तेमाल करके, नेस्ट की गई रिलेशनल इंसर्ट की कार्रवाई की जा सकती है. इससे, पैरंट रिकॉर्ड और उससे जुड़े चाइल्ड रिकॉर्ड, एक ही कार्रवाई में बन जाते हैं. इसके लिए, फ़ॉरेन की को मैन्युअल तरीके से कोरिलेट करने की ज़रूरत नहीं होती.
# Nested insert for Movie and Review
# 1 movie and 2 reviews shown
mutation {
movie_insert(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",
reviews_on_movie: [
{
id: "123e4567-e89b-12d3-a456-426614174002",
rating: 5,
reviewText: "Amazing concept!",
user: { id: "user-uuid-123" }
},
{
id: "123e4567-e89b-12d3-a456-426614174003",
rating: 4,
reviewText: "A bit confusing, but great.",
user: { id: "user-uuid-456" }
}
]
})
}
डेटा सीड को रीसेट करने के लिए म्यूटेशन लिखना
प्रोटोटाइपिंग और CI/CD करते समय, डेटा के नए सेट पर टेस्ट की नई सीरीज़ को लागू करने के लिए, डेटा को ज़ीरो स्टेट पर रीसेट करना काम का हो सकता है.
ऐसा करने के लिए, अगर प्रोटोटाइप कोड, टेबल में रिकॉर्ड नहीं जोड़ता है, तो
_upsertMany म्यूटेशन का इस्तेमाल करें, जो SQL Connect से मिला है.
यहां दिए गए उदाहरण में, मूवी रिकॉर्ड को उनकी ओरिजनल स्टेट में अपडेट करने के लिए, शुरुआती वैल्यू के साथ 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 SQL Connect का इस्तेमाल किया जा सकता है. इसमें, लोकल एनवायरमेंट भी शामिल है. आपको Node.js के लिए सेट अप करना होगा Admin SDK.
SQL Connect के अन्य SQL Connect इस्तेमाल के उदाहरणों में, Admin SDK के इस्तेमाल के बारे में ज़्यादा जाना जा सकता है.
प्रोडक्शन डेटा को बल्क में लोड और अपडेट करना
बल्क में डेटा मैनेज करने के लिए बना एपीआई, आपकी ओर से 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",
// Nested reviews can be inserted atomically along with the movie
reviews_on_movie: [
{
rating: 5,
reviewText: "Amazing concept!",
user: { id: "user-123" } // Link to existing user
}
]
},
{
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",
reviews_on_movie: [
{
rating: 5,
reviewText: "A masterpiece of sci-fi action.",
user: { id: "user-456" }
}
]
}
];
// 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);
प्रोडक्शन डेवलपमेंट: बल्क में डेटा अपडेट करने के लिए SQL का इस्तेमाल करना
जब प्रोडक्शन में स्टेबल स्कीमा के साथ काम किया जाता है और स्कीमा में बदलाव नहीं किया जाता है, तब डेटा लोड और अपडेट मैनेज करने के लिए, Cloud SQL इंस्टेंस में काम किया जा सकता है.
डेटा इंपोर्ट करने के लिए, PostgreSQL के लिए Cloud SQL गाइड देखें.