В Firebase SQL Connect вы можете выполнять массовую загрузку и обновление данных различными способами в зависимости от ваших рабочих процессов и среды:
При локальном прототипировании , когда вы пробуете альтернативные схемы, мутации для заполнения данных можно создавать и вызывать в локальной среде разработки, используя расширение SQL Connect для VS Code, эмулятор SQL Connect и локальный экземпляр базы данных.
В процессе разработки и эксплуатации , при наличии стабильной схемы, при выполнении более масштабных потоков CI/CD и управлении производственными данными, у вас есть два варианта:
Предпочтительный подход — использование Firebase Admin SDK , набора библиотек, работающих в привилегированных средах.
Вы также можете использовать инструменты SQL с вашим экземпляром Cloud SQL для выполнения массовой загрузки и обновления данных, при условии, что вы изменяете данные , а не схему базы данных . Прямое изменение схемы базы данных с помощью инструментов SQL может нарушить работу схемы и коннекторов SQL 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"
}
Запись мутаций для инициализации данных нулевого состояния.
В процессе прототипирования, когда ваши запросы и мутации необходимо протестировать на диапазоне дискретных значений, вы можете заполнить данные несколькими записями. Например, вы можете добавить несколько записей о фильмах с разными жанрами и рейтингами для тестирования сравнений и фильтрации.
Seed data into the Movie and Actor tables
В зависимости от этапа прототипирования, вы можете использовать тот же метод, описанный в руководстве по началу работы, для вставки одной или двух записей: то есть, вы можете использовать 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
# 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" }
}
]
})
}
Напишите мутацию для сброса начальных данных.
При прототипировании и выполнении CI/CD может быть полезно сбросить данные до нулевого состояния для выполнения новой серии тестов на новом наборе данных.
To do so, if your prototype code does't add records to your tables, use the _upsertMany mutation provided by 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 можно узнать здесь.
Perform bulk loads and updates of production data
API для управления большими объемами данных создает мутации GraphQL от вашего имени, вместо того чтобы запрашивать у вас создание mutation {...} с помощью API executeGraphQL описанного ранее для добавления нескольких строк локально.
A major benefit of the administrative API is the ability to separately manage and re-use arrays of data for CI/CD flows, or set up large bulk data files for production data.
Приведенные ниже фрагменты кода демонстрируют, как настроить скрипт для массовой обработки данных.
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 .