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

Dans Firebase Data Connect, les opérations de données groupées sont effectuées à l'aide de mutations. Même si vos projets Data Connect stockent des données dans PostgreSQL, vous ne pouvez pas charger de données de manière groupée à l'aide d'instructions SQL ni d'outils SQL : votre service Data Connect et ses schémas doivent rester synchronisés avec votre base de données, et l'exécution directement dans PostgreSQL interromprait cette synchronisation.

C'est pourquoi Data Connect fournit des mutations _insertMany, _upsertMany et _deleteMany standards pour le semis de données et la gestion des données groupées.

Lorsque vous effectuez des prototypes d'applications et exécutez des flux CI/CD, ces mutations peuvent être appelées dans un environnement de développement local à l'aide de l'extension VS Code, de l'émulateur Data Connect et (facultatif) d'une instance de base de données locale.

Insérer des données de référence dans les instances locales et de production

Dans le guide de démarrage, vous avez configuré une application pour ajouter un seul enregistrement à un seul tableau à 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 développer votre schéma et fournir des données à votre base de données.

Votre environnement de prototypage a besoin de code pour injecter des données. Ce guide fournit quelques exemples illustrant les points suivants :

  • Utilisation de _insertMany et _upsertMany sur des tables individuelles
  • Utilisation de _insertMany sur des tables associées

Mettre à jour le schéma de l'application d'avis sur les films

Vous pouvez utiliser des mutations _insertMany et _upsertMany pour mettre à jour des tables de base de données individuelles une par une ou pour mettre à jour plusieurs tables liées par des relations de jointure. Vous trouverez ci-dessous un schéma détaillé d'une application d'avis sur les films qui permet d'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, 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 générer des données d'état zéro

Au cours du prototypage, lorsque vos requêtes et mutations doivent être testées sur 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.

Insérer des données de départ dans les tables Movie et Actor

Selon votre étape de prototypage, vous pouvez utiliser la technique présentée dans le guide de démarrage pour insérer un ou deux enregistrements: vous pouvez utiliser des lentilles de code 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 logique d'ajouter de nombreux enregistrements à 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 VS Code, dans la vue de l'éditeur de fichiers appropriée, cliquez sur les boutons Run (Production) (Exécuter) ou Run (Local) (Exécuter) CodeLens, selon que vous effectuez le prototypage 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"
    }
   ])
}

Insérer des données dans la table de jointure MovieActor

Pour tester des requêtes et des 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 initiales

Lors du prototypage et de l'exécution de la CI/CD, il peut être utile de réinitialiser les données à un état nul pour exécuter une nouvelle série de tests sur un nouvel ensemble de données.

Pour ce faire, si le code de votre 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",
    }
   
}

Étape suivante