Déplacer des données et effectuer des opérations de données groupées

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 de vos environnements :

  • Dans le prototypage local, lorsque vous essayez d'autres schémas, des mutations d'amorçage de données peuvent être créées et appelées dans un environnement de développement local à l'aide de l'extension Data Connect VS Code, de l'Data Connect émulateur et d'une instance de base de données locale.

  • Dans le développement en 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 disposez de deux options :

    • L'approche recommandée consiste à utiliser le 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. Si vous modifiez directement le schéma de votre base de données avec des outils SQL, vous risquez d'endommager votre Data Connect schéma et vos connecteurs.

Prototypage local : amorcer des données dans des instances locales

Dans le guide de démarrage, vous avez configuré 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 des requêtes et des 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 quelques exemples, illustrant :

  • l'utilisation de _insertMany et _upsertMany sur des tables individuelles ;
  • l'utilisation de _insertMany sur des tables associées.

Modifier le schéma de l'application d'avis sur les films

Vous pouvez utiliser les mutations _insertMany et _upsertMany pour modifier les tables de base de données individuelles une par une, ou modifier plusieurs tables associées par des relations de jointure. Un schéma d'application d'avis sur les films étendu qui illustre ces cas d'utilisation et ces exemples est présenté ci-dessous. Il étend schema.gql au-delà du type Movie de départ pour inclure les types Actor et MovieActor, afin que nous puissions 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 notes pour tester les comparaisons et le filtrage.

Amorcer des données dans les tables Movie et Actor

En fonction de 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 : vous pouvez utiliser CodeLenses dans l'extension Data Connect 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 Data Connect VS Code, dans la vue de l'éditeur de fichiers appropriée, cliquez sur les boutons CodeLens Exécuter (production) ou Exécuter (local) , selon que vous prototypez 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"
    }
   ])
}

Amorcer 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 modifiez plusieurs tables dans ce type de relation, vous pouvez ajouter la directive @transaction pour vous assurer que la modification est effectuée 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 d'amorçage

Lors du prototypage et de l'exécution de CI/CD, il peut être utile de réinitialiser les données à un é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 _upsertMany mutation 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 en production : utiliser le Admin SDK pour remplir et modifier

Le 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 groupées sur vos données de production.

Installer le Firebase Admin SDK

Même si vous travaillez principalement en local, Firebase vous recommande de configurer le Admin SDK afin de pouvoir utiliser Firebase Data Connect à partir d'un environnement privilégié, y compris votre environnement local. Vous devez configurer le Admin SDK pour Node.js.

Pour en savoir plus sur l'utilisation du SDK Admin dans d'autres Data Connect cas d'utilisation.

Effectuer des chargements et des mises à jour groupés des données de production

L'API de gestion groupée des données crée des mutations GraphQL en votre nom, 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 des fichiers de données groupées volumineux 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 en production : utiliser SQL pour les mises à jour groupées de données

Lorsque vous travaillez avec un schéma stable en production et que vous ne le modifiez pas, vous pouvez travailler dans votre instance Cloud SQL pour gérer les chargements et les mises à jour de données.

Pour importer des données, consultez le guide Cloud SQL pour PostgreSQL.

Étape suivante