在 Firebase Data Connect 中,使用更改执行批量数据操作。即使您的 Data Connect 项目在 PostgreSQL 中存储数据,您也无法使用 SQL 语句或 SQL 工具批量加载数据:您的 Data Connect 服务及其架构必须与数据库保持同步,直接在 PostgreSQL 中操作会破坏这种同步。
因此,Data Connect 为种子数据和批量数据管理提供了标准的 _insertMany
、_upsertMany
和 _deleteMany
变更。
在对应用进行原型设计并运行 CI/CD 流程时,可以使用 VS Code 扩展程序、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
表中
根据您当前的原型设计阶段,您可以使用“使用入门指南”中介绍的相同方法插入一项或两项记录:也就是说,您可以使用 VS Code 扩展程序中的 Code Lens 创建 _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 时,将数据重置为零状态,以便对新的数据集执行一系列新测试,这可能会很有用。
为此,如果您的原型代码未向表中添加记录,请使用 Data Connect 提供的 _upsertMany
更改。
在以下示例中,使用初始值调用 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",
}
…
}