Gerar dados e realizar operações de dados em massa

No Firebase Data Connect, é possível fazer cargas e atualizações de dados em massa de diferentes maneiras, dependendo dos seus fluxos de trabalho e ambientes:

  • No protótipo local, ao tentar esquemas alternativos, mutações de inicialização de dados podem ser criadas e chamadas em um ambiente de desenvolvimento local usando a extensão do VS Code, o emulador Data Connect e uma instância de banco de dados local.

  • No desenvolvimento de produção, com um esquema estável, ao realizar fluxos maiores de CI/CD e gerenciar dados de produção, você tem duas opções:

    • A abordagem preferida é usar o Firebase Admin SDK, um conjunto de bibliotecas que são executadas em ambientes privilegiados.

    • Você também pode usar ferramentas SQL com sua instância do Cloud SQL para realizar cargas e atualizações em massa, desde que esteja modificando dados e não o esquema do banco de dados. Modificar o esquema do banco de dados diretamente com ferramentas SQL pode interromper o esquema e os conectores do Data Connect.

Protótipo local: insere dados em instâncias locais

No Guia de início rápido, você configura um app para adicionar um único registro a uma única tabela usando uma mutação de inserção ad hoc.

Para ser útil, o app de avaliação de filmes precisa de dados de filmes, avaliações e usuários para criar protótipos de consultas e mutações que usam junções e outras operações em várias tabelas com dados realistas. É possível expandir o esquema e inicializar o banco de dados.

Seu ambiente de prototipagem precisa de código para realizar a propagação de dados. Este guia fornece algumas amostras, ilustrando:

  • Uso de _insertMany e _upsertMany em tabelas individuais
  • Uso de _insertMany em tabelas relacionadas

Atualizar o esquema do app de avaliação de filmes

É possível usar mutações _insertMany e _upsertMany para atualizar tabelas de banco de dados individuais uma de cada vez ou várias tabelas relacionadas por junções. Confira abaixo um esquema expandido de um app de avaliação de filmes que ajuda a ilustrar esses casos de uso e exemplos. Ele expande schema.gql além do tipo Movie inicial para incluir os tipos Actor e MovieActor, para que possamos criar protótipos de consultas mais complexas.

# 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"
}

Gravar mutações para propagar dados de estado zero

Durante a criação de protótipos, quando suas consultas e mutações precisam ser testadas em uma variedade de valores discretos, é possível preencher os dados com vários registros. Por exemplo, você pode adicionar vários registros de filmes com diferentes tipos de gêneros e classificações para testar comparações e filtragem.

Incluir dados nas tabelas Movie e Actor

Dependendo da sua fase de prototipagem, você pode usar a mesma técnica apresentada no guia de início rápido para inserir um ou dois registros. Ou seja, você pode usar o CodeLenses na extensão do VS Code para criar mutações _insert, codificar dados e executar essas mutações no VS Code.

Eventualmente, faz mais sentido adicionar muitos registros a uma tabela usando uma operação _insertMany. No exemplo do app de análise de filmes, isso insere um conjunto inicial de dados em Movie e Actor.

Para executar as mutações a seguir usando a extensão do Firebase para VS Code, na visualização do editor de arquivos apropriada, clique nos botões Executar (produção) ou Executar (local) do CodeLens, dependendo se você está criando um protótipo com seu serviço de produção ou um banco de dados local.

# 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"
    }
   ])
}

Propagar dados na tabela de junção MovieActor

Para testar consultas e mutações usando junções e outras operações complexas, adicione vários registros à tabela MovieActor.

Aqui, ao atualizar várias tabelas nesse tipo de relação, você pode adicionar a diretiva @transaction para garantir que a atualização seja concluída corretamente.

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"
    }
  ])
}

Escrever uma mutação para redefinir os dados de origem

Durante a criação de protótipos e a execução de CI/CD, pode ser útil redefinir os dados para um estado zero para executar uma nova série de testes em um novo conjunto de dados.

Para isso, se o código do protótipo não adicionar registros às tabelas, use a mutação _upsertMany fornecida por Data Connect.

No exemplo a seguir, movie_upsertMany é chamado com os valores iniciais para atualizar os registros de filmes ao estado original.

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",
    }
   
}

Desenvolvimento de produção: use o Admin SDK para preencher e atualizar

O Firebase Admin SDK está disponível para quando você quer trabalhar em ambientes privilegiados. Esse é um caso de uso importante quando você quer carregar milhares de registros, dada a natureza crítica das operações de dados em massa nos seus dados de produção.

Instale o Firebase Admin SDK

Mesmo que você trabalhe principalmente no ambiente local, o Firebase recomenda configurar o Admin SDK para usar o Firebase Data Connect em um ambiente privilegiado, incluindo o ambiente local. É necessário configurar o Admin SDK para Node.js.

Saiba mais sobre como usar o SDK Admin em outros Data Connect casos de uso.

Realizar atualizações e carregamentos em massa de dados de produção

A API para gerenciamento de dados em massa cria mutações do GraphQL em seu nome, em vez de pedir que você crie strings mutation {...} com a API executeGraphQL descrita anteriormente para adicionar algumas linhas aqui e ali localmente.

Um dos principais benefícios da API administrativa é a capacidade de gerenciar e reutilizar separadamente matrizes de dados para fluxos de CI/CD ou configurar grandes arquivos de dados em massa para dados de produção.

Os snippets a seguir demonstram como configurar um script de dados em massa.

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);

Desenvolvimento de produção: use SQL para atualizações de dados em massa

Quando você trabalha com um esquema estável em produção e não o modifica, é possível trabalhar na instância do Cloud SQL para gerenciar cargas e atualizações de dados.

Consulte o guia do Cloud SQL para PostgreSQL sobre como importar dados.

A seguir