Dans Firebase Data Connect, vous pouvez effectuer des chargements et des mises à jour groupés de données de différentes manières, en fonction de vos workflows et environnements :
Dans le prototypage local, lorsque vous essayez d'autres schémas, des mutations de seeding de données peuvent être créées et appelées dans un environnement de développement local à l'aide de l'extension VS Code, de l'émulateur Data Connect et d'une instance de base de données locale.
Dans le développement de production, avec un schéma stable, lorsque vous effectuez des flux CI/CD plus importants et que vous gérez des données de production, vous avez deux options :
L'approche recommandée consiste à utiliser Firebase Admin SDK, un ensemble de bibliothèques qui s'exécutent dans des environnements privilégiés.
Vous pouvez également utiliser des outils SQL avec votre instance Cloud SQL pour effectuer des chargements et des mises à jour groupés, à condition de modifier les données et non le schéma de votre base de données. La modification directe du schéma de votre base de données avec des outils SQL peut endommager votre schéma et vos connecteurs Data Connect.
Prototypage local : données d'amorçage dans les instances locales
Dans le guide de démarrage, vous configurez une application pour ajouter un seul enregistrement à une seule table à l'aide d'une mutation d'insertion ad hoc.
Pour être utilisable, l'application d'avis sur les films a besoin de données sur les films, les avis et les utilisateurs pour prototyper les requêtes et les mutations qui utilisent des jointures et d'autres opérations sur plusieurs tables avec des données réalistes. Vous pouvez étendre votre schéma et amorcer votre base de données.
Votre environnement de prototypage a besoin de code pour effectuer l'amorçage des données. Ce guide fournit des exemples illustrant les points suivants :
- Utilisation de
_insertMany
et_upsertMany
dans des tableaux individuels - Utilisation de
_insertMany
sur les tables associées
Mettre à jour le schéma de l'application d'avis sur les films
Vous pouvez utiliser les mutations _insertMany
et _upsertMany
pour mettre à jour les tables de base de données individuelles une par une, ou mettre à jour plusieurs tables liées par des relations de jointure. Vous trouverez ci-dessous un schéma d'application d'avis sur les films développé pour illustrer ces cas d'utilisation et exemples. Il étend schema.gql
au-delà du type Movie
de départ pour inclure les types Actor
et MovieActor
, ce qui nous permet de prototyper des requêtes plus complexes.
# 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"
}
Écrire des mutations pour amorcer des données d'état zéro
Lors du prototypage, lorsque vos requêtes et mutations doivent être testées par rapport à une plage de valeurs discrètes, vous pouvez remplir les données avec plusieurs enregistrements. Par exemple, vous pouvez ajouter plusieurs enregistrements de films avec différents types de genres et de classifications pour tester les comparaisons et le filtrage.
Renseigner des données dans les tables Movie
et Actor
Selon l'étape de prototypage, vous pouvez utiliser la même technique que celle présentée dans le guide de démarrage pour insérer un ou deux enregistrements. Autrement dit, vous pouvez utiliser les CodeLenses dans l'extension VS Code pour créer des mutations _insert
, coder en dur des données et exécuter ces mutations dans VS Code.
À terme, il est plus judicieux d'ajouter de nombreux enregistrements dans une table à l'aide d'une opération _insertMany
. Dans l'exemple d'application d'avis sur les films, cela insère un ensemble initial de données dans Movie
et Actor
.
Pour exécuter les mutations suivantes à l'aide de l'extension Firebase pour VS Code, dans la vue de l'éditeur de fichier appropriée, cliquez sur les boutons CodeLens Exécuter (production) ou Exécuter (local), selon que vous créez un prototype avec votre service de production ou une base de données locale.
# 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"
}
])
}
Déplacer des données dans la table de jointure MovieActor
Pour tester les requêtes et les mutations à l'aide de jointures et d'autres opérations complexes, vous pouvez ajouter plusieurs enregistrements à la table MovieActor
.
Ici, lorsque vous mettez à jour plusieurs tables dans ce type de relation, vous pouvez ajouter la directive @transaction
pour vous assurer que la mise à jour se termine correctement.
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"
}
])
}
Écrire une mutation pour réinitialiser les données sources
Lors du prototypage et de l'exécution de CI/CD, il peut être utile de réinitialiser les données à l'état zéro pour exécuter une nouvelle série de tests sur un nouvel ensemble de données.
Pour ce faire, si votre code de prototype n'ajoute pas d'enregistrements à vos tables, utilisez la mutation _upsertMany
fournie par Data Connect.
Dans l'exemple suivant, movie_upsertMany
est appelé avec les valeurs initiales pour rétablir l'état d'origine des enregistrements de films.
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",
}
…
}
Développement de la production : utilisez Admin SDK pour remplir et mettre à jour
Firebase Admin SDK est disponible lorsque vous souhaitez travailler à partir d'environnements privilégiés. Il s'agit d'un cas d'utilisation important lorsque vous souhaitez charger des milliers d'enregistrements, étant donné la nature critique des opérations de données groupées sur vos données de production.
Installer Firebase Admin SDK
Même si vous travaillez principalement en local, Firebase recommande de configurer Admin SDK pour pouvoir utiliser Firebase Data Connect à partir d'un environnement privilégié, y compris votre environnement local. Vous devrez configurer Admin SDK pour Node.js.
Pour en savoir plus sur l'utilisation du SDK Admin dans d'autres cas d'utilisation Data Connect, consultez la documentation.
Effectuer des chargements et des mises à jour groupés des données de production
L'API de gestion des données groupées crée des mutations GraphQL à votre place, au lieu de vous demander de créer des chaînes mutation {...}
avec l'API executeGraphQL
décrite précédemment pour ajouter quelques lignes ici et là en local.
L'un des principaux avantages de l'API d'administration est la possibilité de gérer et de réutiliser séparément des tableaux de données pour les flux CI/CD, ou de configurer de grands fichiers de données groupées pour les données de production.
Les extraits suivants montrent comment configurer un script de données groupées.
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);
Développement de la production : utiliser SQL pour mettre à jour les données de manière groupée
Lorsque vous travaillez avec un schéma stable en production et que vous ne le modifiez pas, vous pouvez utiliser votre instance Cloud SQL pour gérer les chargements et les mises à jour de données.
Consultez le guide Cloud SQL pour PostgreSQL sur l'importation de données.
Étape suivante
- Découvrez comment intégrer Admin SDK à vos projets Data Connect.