En Firebase Data Connect, las operaciones de datos masivas se realizan con mutaciones. Aunque tus proyectos de Data Connect almacenan datos en PostgreSQL, no puedes cargar datos de forma masiva con instrucciones SQL ni herramientas de SQL: tu servicio de Data Connect y sus esquemas deben mantenerse sincronizados con tu base de datos, y operar directamente en PostgreSQL rompería esta sincronización.
En Data Connect, se usan mutaciones para generar datos y administrar datos en bloque. Puedes crear y llamar a mutaciones de administración de datos de diferentes maneras según tus flujos de trabajo y entornos:
En el desarrollo local, cuando creas prototipos de apps, se pueden crear mutaciones de siembra de datos y llamar a ellas 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, cuando realizas flujos de CI/CD más grandes y administras datos de producción, puedes usar Firebase Admin SDK, un conjunto de bibliotecas que se ejecutan en entornos con privilegios.
Desarrollo local: Cómo crear datos iniciales en instancias locales
En la Guía de introducción, configuraste una app para agregar un solo registro a una sola tabla con una mutación de inserción ad hoc.
Para que se pueda usar, la app de opiniones de películas necesita datos de películas, opiniones y usuarios para prototipar consultas y mutaciones que usen combinaciones y otras operaciones en varias tablas con datos realistas. Puedes expandir tu esquema y crear tu base de datos.
Tu entorno de prototipado necesita código para realizar la propagació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 mutaciones _insertMany
y _upsertMany
para actualizar tablas de bases de datos individuales una a la vez o actualizar varias tablas relacionadas por relaciones de unión. A continuación, se muestra un esquema expandido de la app de opiniones 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 generar datos de estado cero
Durante el prototipado, cuando tus consultas y mutaciones deban probarse en un rango de valores discretos, puedes propagar 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 las comparaciones y el filtrado.
Cómo generar datos en las tablas Movie
y Actor
Según la etapa de prototipado, puedes usar la misma técnica
introducida en la guía de Introducción para insertar uno o dos registros: es decir, puedes
usar CodeLens en la extensión de VS Code para crear mutaciones _insert
,
codificar datos y ejecutar esas mutaciones en VS Code.
En última instancia, tiene más sentido agregar muchos registros a una tabla con una operación _insertMany
. En el ejemplo de la app de opiniones 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 Run (Production) o Run (Local) de CodeLens, según si estás creando prototipos 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"
}
])
}
Cómo propagar datos en la tabla de unión MovieActor
Para probar consultas y mutaciones con uniones y otras operaciones complejas, puedes
añadir 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
Mientras se crea un prototipo y se realiza la CI/CD, puede ser útil restablecer los datos a un estado cero para ejecutar una nueva serie de pruebas en un conjunto de datos nuevo.
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 propagar y actualizar
Firebase Admin SDK está disponible para cuando quieras trabajar desde entornos con privilegios. Este es un caso de uso importante cuando deseas cargar miles de registros, debido a la naturaleza fundamental de las operaciones de datos masivos en tus datos de producción.
Instala 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, incluso tu entorno local. Deberás configurar Admin SDK para Node.js.
Obtén más información para usar el SDK de Admin en otros Data Connect casos de uso.
Realiza cargas masivas y actualizaciones de datos de producción
La API de administración masiva de datos compila mutaciones de GraphQL en tu nombre, en lugar de pedirte que crees cadenas mutation {...}
con la API de executeGraphQL
que se describió antes para agregar algunas filas aquí y allá de forma local.
Un beneficio importante de la API administrativa es la capacidad de administrar y reutilizar arrays de datos de forma independiente para flujos de CI/CD, o configurar grandes archivos de datos masivos para 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);
Próximos pasos
- Obtén información para integrar Admin SDK en tus proyectos de Data Connect.