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

Em Firebase SQL Connect, é possível realizar cargas e atualizações de dados em diferentes maneiras, dependendo dos seus 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 SQL Connect VS Code, o SQL 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 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 SQL Connect.

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

No guia de início rápido, 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 prototipar 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 propagar o banco de dados.

O ambiente de prototipagem 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 prototipar 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 prototipagem, quando as consultas e mutações precisam ser testadas em um intervalo 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 do estágio de prototipagem, é possível usar a mesma técnica apresentada no guia de início rápido para inserir um ou dois registros: ou seja, é possível usar o CodeLenses na extensão do SQL Connect VS Code para criar _insert mutações, 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 SQL 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á prototipando 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

Durante a prototipagem e a execução de 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 SQL 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 SQL 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 SQL 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