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

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

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

  • В процессе разработки и эксплуатации , при наличии стабильной схемы, при выполнении более масштабных потоков CI/CD и управлении производственными данными, у вас есть два варианта:

    • Предпочтительный подход — использование Firebase Admin SDK , набора библиотек, работающих в привилегированных средах.

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

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

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

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

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

  • Использование _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);

Разработка производственной среды: использование SQL для массового обновления данных.

При работе со стабильной схемой в производственной среде и без ее изменения вы можете управлять загрузкой и обновлением данных в своем экземпляре Cloud SQL.

Для импорта данных обратитесь к руководству по Cloud SQL для PostgreSQL .

Что дальше?