В Firebase SQL Connect вы можете выполнять массовую загрузку и обновление данных различными способами в зависимости от ваших рабочих процессов и среды:
При локальном прототипировании , когда вы пробуете альтернативные схемы, мутации для заполнения данных можно создавать и вызывать в локальной среде разработки, используя расширение SQL Connect для VS Code, эмулятор SQL Connect и локальный экземпляр базы данных.
В процессе разработки и эксплуатации , при наличии стабильной схемы, при выполнении более масштабных потоков CI/CD и управлении производственными данными, у вас есть два варианта:
Предпочтительный подход — использование Firebase Admin SDK , набора библиотек, работающих в привилегированных средах.
Вы также можете использовать инструменты SQL с вашим экземпляром Cloud SQL для выполнения массовой загрузки и обновления данных, при условии, что вы изменяете данные , а не схему базы данных . Прямое изменение схемы базы данных с помощью инструментов SQL может нарушить работу схемы и коннекторов SQL Connect .
Локальное прототипирование: исходные данные в локальных экземплярах.
В руководстве по началу работы вы настраиваете приложение для добавления одной записи в одну таблицу с помощью произвольной мутации вставки.
Для корректной работы приложению для обзоров фильмов необходимы данные о фильмах, отзывах и пользователях для прототипирования запросов и мутаций, использующих объединения и другие операции над несколькими таблицами с реалистичными данными. Вы можете расширить свою схему и заполнить базу данных данными.
Вашей среде прототипирования необходим код для заполнения данных. В этом руководстве приведены несколько примеров, иллюстрирующих:
- Использование
_insertManyи_upsertManyдля отдельных таблиц - Использование
_insertManyдля связанных таблиц
Обновите схему приложения для отзывов о фильмах.
You can use _insertMany and _upsertMany mutations to update individual database tables one at a time, or update multiple tables related by join relationships. An expanded movie review app schema that helps illustrate these use cases and examples is shown below. It expands schema.gql beyond the starting Movie type to include Actor and MovieActor types, so we can prototype more complex queries.
# 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 в расширении SQL Connect для VS Code, чтобы создавать мутации _insert , жестко закодировать данные и запускать эти мутации в VS Code .
В конечном итоге, логичнее добавлять множество записей в таблицу с помощью операции _insertMany . В примере с приложением для обзоров фильмов это вставляет начальный набор данных в Movie и Actor .
Для выполнения следующих изменений с помощью расширения SQL Connect VS Code в соответствующем окне редактора файлов нажмите кнопки « Запустить (Производственная среда)» или «Запустить (Локальная среда)» в зависимости от того, используете ли вы прототип для производственной среды или локальной базы данных.
# 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"
}
])
}
Заполнение связанных таблиц данными с использованием вложенных операций (один ко многим и один к одному).
Для атомарного заполнения связанных таблиц можно выполнить вложенную реляционную вставку с использованием литеральных данных. Это создаст родительскую запись и связанные с ней дочерние записи за одну операцию без необходимости ручной корреляции внешних ключей.
Для отношений «один ко многим» вы предоставляете массив вложенных дочерних записей. Для отношений «один к одному» вы предоставляете один вложенный дочерний объект.
# Nested insert for Movie and Review (one-to-many)
# 1 movie and 2 reviews shown
mutation {
movie_insert(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",
reviews_on_movie: [
{
id: "123e4567-e89b-12d3-a456-426614174002",
rating: 5,
reviewText: "Amazing concept!",
user: { id: "user-uuid-123" }
},
{
id: "123e4567-e89b-12d3-a456-426614174003",
rating: 4,
reviewText: "A bit confusing, but great.",
user: { id: "user-uuid-456" }
}
]
})
}
# Nested insert for User and Profile (one-to-one)
mutation {
user_insert(data: {
id: "user-uuid-123",
name: "Alice",
profile_on_user: {
bio: "Avid moviegoer and critic."
}
})
}
Напишите мутацию для сброса начальных данных.
При прототипировании и выполнении CI/CD может быть полезно сбросить данные до нулевого состояния для выполнения новой серии тестов на новом наборе данных.
Для этого, если ваш прототип кода не добавляет записи в таблицы, используйте мутацию _upsertMany предоставляемую SQL 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 SQL Connect из привилегированной среды, включая вашу локальную среду. Вам потребуется настроить Admin SDK для Node.js.
Подробнее об использовании Admin SDK в других сценариях применения SQL 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",
// Nested reviews can be inserted atomically along with the movie
reviews_on_movie: [
{
rating: 5,
reviewText: "Amazing concept!",
user: { id: "user-123" } // Link to existing user
}
]
},
{
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",
reviews_on_movie: [
{
rating: 5,
reviewText: "A masterpiece of sci-fi action.",
user: { id: "user-456" }
}
]
}
];
// 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 в ваши проекты SQL Connect .