В 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, в соответствующем представлении редактора файлов нажмите кнопки Run (Production) или Run (Local) 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 .
Что дальше?
- Узнайте об интеграции Admin SDK в ваши проекты Data Connect .