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

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

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

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

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

    • Também é possível usar ferramentas SQL com a instância do Cloud SQL para realizar cargas e atualizações em massa, desde que você esteja modificando dados e não o esquema do banco de dados. Modificar o esquema do banco de dados diretamente com ferramentas SQL pode quebrar o esquema e os conectores.Data Connect

Protótipo local: dados de propagação em instâncias locais

No guia de introdução, você configurou 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 consultas e mutações de protótipo que usam junções e outras operações em várias tabelas com dados realistas. É possível expandir o esquema e propagar o banco de dados.

O ambiente de protótipo precisa de código para realizar a propagação de dados. Este guia fornece alguns exemplos, 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 atualizar várias tabelas relacionadas por relações de junção. Um esquema expandido do app de avaliação de filmes que ajuda a ilustrar esses casos de uso e exemplos é mostrado abaixo. 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"
}

Escrever mutações para propagar dados de estado zero

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

Propagar dados nas tabelas Movie e Actor

Dependendo da fase de criação de protótipos, é possível usar a mesma técnica apresentada no guia de introdução para inserir um ou dois registros: ou seja, é possível usar o CodeLenses na extensão do Data Connect 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 avaliação 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 Data Connect VS Code, em a 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 o 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, é possível adicionar vários registros à tabela MovieActor.

Aqui, ao atualizar várias tabelas nesse tipo de relação, é possível 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 dados de propagação

Ao criar protótipos e realizar CI/CD, redefinir os dados para um estado zero para executar uma nova série de testes em um novo conjunto de dados pode ser útil.

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

No exemplo a seguir, movie_upsertMany é chamado com os valores iniciais para atualizar os registros de filmes para o 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: usar o Admin SDK para preencher e atualizar

O Firebase Admin SDK está disponível 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 dados de produção.

Instalar o Firebase Admin SDK

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

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

Realizar cargas e atualizações 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 arquivos de dados em massa grandes 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: usar SQL para atualizações de dados em massa

Ao trabalhar com um esquema estável em produção e não modificar o esquema, é 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 para importar dados.

A seguir