Заполнение данных и выполнение операций с большими объемами данных

В Firebase Data Connect массовые операции с данными выполняются с использованием мутаций. Несмотря на то, что ваши проекты Data Connect хранят данные в PostgreSQL, вы не можете массово загружать данные с помощью операторов SQL или инструментов SQL: ваша служба Data Connect и ее схемы должны оставаться синхронизированными с вашей базой данных, а работа напрямую в PostgreSQL нарушит эту синхронизацию.

В Data Connect вы используете мутации для заполнения данных и управления массовыми данными. Вы можете создавать и вызывать мутации управления данными разными способами в зависимости от ваших рабочих процессов и сред:

  • При локальной разработке , когда вы создаете прототипы приложений, мутации заполнения данных можно создавать и вызывать в локальной среде разработки с помощью расширения VS Code, эмулятора Data Connect и локального экземпляра базы данных.

  • В производственной разработке , когда вы выполняете более крупные потоки CI/CD и управляете производственными данными, вы можете использовать Firebase Admin SDK — набор библиотек, которые работают в привилегированных средах.

Локальное развитие: исходные данные в локальных экземплярах

В руководстве по началу работы вы настраиваете приложение для добавления одной записи в одну таблицу с помощью специальной мутации вставки.

Чтобы быть пригодным для использования, приложению обзора фильмов нужны данные о фильмах, обзорах и пользователях для прототипирования запросов и мутаций, которые используют объединения и другие операции над несколькими таблицами с реалистичными данными. Вы можете расширить свою схему и заполнить свою базу данных.

Ваша среда прототипирования нуждается в коде для выполнения посева данных. Это руководство содержит несколько примеров, иллюстрирующих:

  • Использование _insertMany и _upsertMany в отдельных таблицах
  • Использование _insertMany в связанных таблицах

Обновите схему приложения для обзора фильмов

Вы можете использовать мутации _insertMany и _upsertMany для обновления отдельных таблиц базы данных по одной за раз или для обновления нескольких таблиц, связанных отношениями соединения. Ниже показана расширенная схема приложения обзора фильмов, которая помогает проиллюстрировать эти варианты использования и примеры. Она расширяет schema.gql за пределы начального типа Movie , включая типы Actor и MovieActor , поэтому мы можем прототипировать более сложные запросы.

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

Запись мутаций для заполнения данных нулевого состояния

Во время прототипирования, когда ваши запросы и мутации необходимо тестировать на основе ряда дискретных значений, вы можете заполнить данные несколькими записями. Например, вы можете захотеть добавить несколько записей фильмов с разными типами жанров и рейтингов для тестирования сравнений и фильтрации.

Загрузить данные в таблицы Movie и Actor

В зависимости от стадии создания прототипа вы можете использовать ту же технику, представленную в руководстве по началу работы, чтобы вставить одну или две записи: то есть вы можете использовать CodeLenses в расширении VS Code для создания мутаций _insert , жесткого кодирования данных и запуска этих мутаций в VS Code .

В конце концов, имеет смысл добавлять много записей в таблицу с помощью операции _insertMany . В примере приложения обзора фильмов это вставляет начальный набор данных в Movie и Actor .

Чтобы выполнить следующие мутации, используя расширение VS Code Firebase, в соответствующем представлении редактора файлов нажмите кнопки « Запустить (в производстве)» или «Запустить (локально)» CodeLens в зависимости от того, создаете ли вы прототип с помощью своей производственной службы или локальной базы данных.

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

Загрузить данные в таблицу соединений MovieActor

Для тестирования запросов и мутаций с использованием объединений и других сложных операций вы можете добавить несколько записей в таблицу MovieActor .

Здесь, когда вы обновляете несколько таблиц в таком типе связи, вы можете добавить директиву @transaction , чтобы гарантировать правильное завершение обновления.

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

Написать мутацию для сброса начальных данных

При создании прототипа и выполнении CI/CD может быть полезным сброс данных в нулевое состояние для выполнения новой серии тестов на новом наборе данных.

Для этого, если ваш прототипный код не добавляет записи в таблицы, используйте мутацию _upsertMany , предоставляемую Data Connect .

В следующем примере movie_upsertMany вызывается с начальными значениями для обновления записей фильмов до их исходного состояния.

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

Разработка продукции: используйте Admin SDK для заполнения и обновления

Firebase Admin SDK доступен, когда вы хотите работать из привилегированных сред. Это важный вариант использования, когда вы хотите загрузить тысячи записей, учитывая критическую природу массовых операций с данными в ваших производственных данных.

Установите Firebase Admin SDK

Даже если вы в основном работаете локально, Firebase рекомендует настроить Admin SDK , чтобы вы могли использовать Firebase Data Connect из привилегированной среды, включая вашу локальную среду. Вам нужно будет настроить Admin SDK для Node.js.

Подробнее об использовании Admin SDK в других вариантах использования Data Connect можно узнать .

Выполнять массовые загрузки и обновления производственных данных

API для управления массовыми данными создает мутации GraphQL от вашего имени, а не просит вас создавать строки mutation {...} с помощью API executeGraphQL , описанного ранее для добавления нескольких строк здесь и там локально.

Основным преимуществом административного API является возможность отдельного управления и повторного использования массивов данных для потоков CI/CD или создания больших объемов данных для производственных данных.

В следующих фрагментах показано, как настроить скрипт для обработки больших объемов данных.

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

Что дальше?