En Firebase Data Connect, puedes realizar cargas y actualizaciones masivas de datos de diferentes maneras según tus flujos de trabajo y entornos:
En el prototipado local, cuando pruebas esquemas alternativos, se pueden crear y llamar mutaciones de inicialización de datos en un entorno de desarrollo local con la extensión de VS Code, el emulador de Data Connect y una instancia de base de datos local.
En el desarrollo de producción, con un esquema estable, cuando realizas flujos de CI/CD más grandes y administras datos de producción, tienes dos opciones:
El enfoque preferido es usar Firebase Admin SDK, un conjunto de bibliotecas que se ejecutan en entornos con privilegios.
También puedes usar herramientas de SQL con tu instancia de Cloud SQL para realizar cargas y actualizaciones masivas, siempre y cuando modifiques los datos y no el esquema de la base de datos. Modificar el esquema de tu base de datos directamente con herramientas de SQL puede dañar tus conectores y esquemas de Data Connect.
Creación de prototipos locales: datos de inicialización en instancias locales
En la guía de inicio, configuraste una app para agregar un solo registro a una sola tabla con una mutación de inserción ad hoc.
Para que sea utilizable, la app de opiniones de películas necesita datos de películas, opiniones y usuarios para las consultas y mutaciones de prototipos que usan uniones y otras operaciones en varias tablas con datos realistas. Puedes expandir tu esquema y completar tu base de datos.
Tu entorno de creación de prototipos necesita código para realizar la inicialización de datos. En esta guía, se proporcionan algunos ejemplos que ilustran lo siguiente:
- Uso de
_insertMany
y_upsertMany
en tablas individuales - Uso de
_insertMany
en tablas relacionadas
Actualiza el esquema de la app de opiniones sobre películas
Puedes usar las mutaciones _insertMany
y _upsertMany
para actualizar tablas de bases de datos individuales de a una, o bien actualizar varias tablas relacionadas por relaciones de unión. A continuación, se muestra un esquema expandido de la app de reseñas de películas que ayuda a ilustrar estos casos de uso y ejemplos. Expande schema.gql
más allá del tipo Movie
inicial para incluir los tipos Actor
y MovieActor
, de modo que podamos crear prototipos de consultas más complejas.
# 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"
}
Escribe mutaciones para propagar datos de estado cero
Durante la creación de prototipos, cuando tus consultas y mutaciones deben probarse con un rango de valores discretos, puedes completar los datos con varios registros. Por ejemplo, es posible que desees agregar varios registros de películas con diferentes tipos de géneros y calificaciones para probar comparaciones y filtrado.
Inicializa datos en las tablas Movie
y Actor
Según la etapa de creación de prototipos, puedes usar la misma técnica que se presentó en la guía de inicio para insertar uno o dos registros, es decir, puedes usar CodeLenses en la extensión de VS Code para crear mutaciones de _insert
, codificar datos de forma rígida y ejecutar esas mutaciones en VS Code.
Con el tiempo, tiene más sentido agregar muchos registros a una tabla con una operación _insertMany
. En el ejemplo de la app de reseñas de películas, esto inserta un conjunto inicial de datos en Movie
y Actor
.
Para ejecutar las siguientes mutaciones, usa la extensión de Firebase para VS Code y, en la vista del editor de archivos correspondiente, haz clic en los botones de CodeLens Ejecutar (producción) o Ejecutar (local), según si estás creando un prototipo con tu servicio de producción o una base de datos local.
# 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"
}
])
}
Propaga datos en la tabla de unión MovieActor
Para probar consultas y mutaciones con uniones y otras operaciones complejas, puedes agregar varios registros a la tabla MovieActor
.
Aquí, cuando actualizas varias tablas en este tipo de relación, puedes agregar la directiva @transaction
para asegurarte de que la actualización se complete correctamente.
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"
}
])
}
Escribe una mutación para restablecer los datos de origen
Durante la creación de prototipos y la realización de CI/CD, puede ser útil restablecer los datos a un estado cero para ejecutar una nueva serie de pruebas en un nuevo conjunto de datos.
Para ello, si el código de tu prototipo no agrega registros a tus tablas, usa la mutación _upsertMany
que proporciona Data Connect.
En el siguiente ejemplo, se llama a movie_upsertMany
con los valores iniciales para actualizar los registros de películas a su estado original.
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",
}
…
}
Desarrollo de producción: Usa Admin SDK para completar y actualizar
El Firebase Admin SDK está disponible cuando deseas trabajar desde entornos privilegiados. Este es un caso de uso importante cuando deseas cargar miles de registros, dada la naturaleza crítica de las operaciones de datos masivas en tus datos de producción.
Instala el Firebase Admin SDK
Incluso si trabajas principalmente de forma local, Firebase recomienda configurar Admin SDK para que puedas usar Firebase Data Connect desde un entorno privilegiado, incluido tu entorno local. Deberás configurar Admin SDK para Node.js.
Puedes obtener más información para usar el SDK de Admin en otros casos de uso de Data Connect.
Realizar cargas y actualizaciones masivas de datos de producción
La API para la administración de datos masivos compila mutaciones de GraphQL en tu nombre, en lugar de pedirte que compiles cadenas de mutation {...}
con la API de executeGraphQL
que se describió anteriormente para agregar algunas filas aquí y allá de forma local.
Un beneficio importante de la API administrativa es la capacidad de administrar y reutilizar por separado los arrays de datos para los flujos de CI/CD, o bien configurar grandes archivos de datos masivos para los datos de producción.
En los siguientes fragmentos, se muestra cómo configurar una secuencia de comandos de datos masivos.
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);
Desarrollo de producción: Usa SQL para actualizaciones masivas de datos
Cuando trabajas con un esquema estable en producción y no lo modificas, puedes trabajar en tu instancia de Cloud SQL para administrar las cargas y actualizaciones de datos.
Consulta la guía de Cloud SQL para PostgreSQL para importar datos.
Próximos pasos
- Obtén más información para integrar Admin SDK en tus proyectos de Data Connect.