Gadget Shopify Sync API 实战:限制同步数量与时间范围

文章目录

在开发 Shopify 应用时,通常需要把 Shopify 店铺中的产品、订单、客户或库存数据同步到应用自己的数据库中。

如果店铺只有几个产品,完整同步一次并不麻烦。但在开发测试阶段,或者面对拥有大量产品的店铺时,一次同步全部数据可能会带来几个问题:

  • 同步时间过长。
  • 开发环境消耗更多资源。
  • 测试数据太多,不容易检查。
  • Shopify API 请求数量增加。
  • 数据库中出现大量暂时用不到的记录。
  • 应用安装流程变慢。

Gadget Shopify Sync API 提供了更细的同步控制方式。开发者可以指定:

  • 只同步最近的几条父级记录。
  • 按更新时间或创建时间排序。
  • 只同步某个时间点之后发生变化的数据。
  • 在后台手动选择同步最近数据或全部数据。

本文演示如何使用 syncLast、syncLastBy 和 syncSince 控制 Shopify 数据同步。

这份项目实际演示了什么

在应用安装时限制首次同步

字幕中的示例配置在 Shopify Shop 安装 Action 的成功回调中。

当应用安装到 Shopify 店铺后,Gadget 会启动 Shopify 数据同步。开发者可以在这个安装流程中指定:

只同步最近 2 条产品记录

这样,开发环境就不会在安装应用时同步整个产品目录。

默认同步最近更新的产品

示例配置为:

syncLast: 2
syncLastBy: updatedAt

含义是:

按照 updatedAt 排序,只同步最近更新的 2 条父级产品记录

测试后,Gadget 数据库中只出现两个 Shopify 产品。

改为同步最近创建的产品

如果将排序字段改为:

syncLastBy: createdAt

同步逻辑就会变成:

按照 createdAt 排序,只同步最近创建的 2 条父级产品记录

这个选项适合测试“最近新建的产品”,而不是测试“最近修改过的产品”。

项目使用的技术栈

Gadget Shopify 应用

项目使用 Gadget 作为 Shopify 应用后端和数据同步平台。

Gadget 负责:

  • 管理 Shopify 应用连接。
  • 保存 Shopify 产品数据。
  • 执行 Shopify 数据同步。
  • 管理产品与变体模型。
  • 处理 Shopify 安装流程。
  • 提供同步 Action 和 API。
  • 将数据写入托管数据库。

Shopify 产品模型

Shopify 产品是本项目的父级模型。

产品通常包含:

  • 产品标题。
  • 产品描述。
  • 产品状态。
  • 产品图片。
  • 产品选项。
  • 产品变体。
  • 产品时间字段。

Shopify 产品变体模型

Shopify Product Variant 是产品的子级记录。

例如,一个产品可能有:

  • Small、Medium、Large 三个尺码。
  • Black、White 两种颜色。
  • 多个价格和库存组合。

产品和变体之间存在父子关系:

Product
└── Product Variant
└── Product Variant
└── Product Variant

这条父子关系是理解 Gadget 同步范围的关键。

配置 syncLast

syncLast 的作用

syncLast 用于指定要同步多少条父级记录。

示意配置:

{
  syncLast: 2
}

这表示只同步最近的两条父级记录。

对于产品同步来说,父级记录就是 Product,而不是 Product Variant。

syncLast 不会限制所有记录数量

假设同步配置为:

{
  syncLast: 2
}

Shopify 中最近有两个产品:

Product A
Product B

其中 Product A 有 3 个变体,Product B 有 100 个变体。

同步结果会是:

2 个 Product
103 个 Product Variant

也就是说,syncLast 限制的是父级产品数量,而不是所有数据库记录的总数量。

Gadget 会同步这两个产品对应的全部变体,不会只取两个变体,也不会把变体拆成另一批只同步一部分。

为什么要按父级记录限制

父级限制更符合 Shopify 商品目录的结构。

如果只同步一个产品,就应该同时获得这个产品的完整变体信息,否则产品价格、库存和选项可能不完整。

因此,syncLast 的实际含义是:

限制同步多少个父级资源,同时保留这些资源的完整子记录

配置 syncLastBy

按更新时间同步

如果没有指定 syncLastBy,同步通常会使用更新时间字段。

为了让配置更清楚,可以显式指定:

{
  syncLast: 2,
  syncLastBy: "updatedAt"
}

这个配置会同步最近更新的两个产品。

适合以下场景:

  • 测试最近修改的产品。
  • 检查产品编辑后的同步结果。
  • 验证应用是否可以读取最新商品信息。
  • 快速同步开发店铺中刚刚调整的产品。

按创建时间同步

也可以使用创建时间:

{
  syncLast: 2,
  syncLastBy: "createdAt"
}

这个配置会同步最近创建的两个产品。

适合以下场景:

  • 测试新建产品。
  • 导入刚刚添加的商品。
  • 验证产品安装流程。
  • 在开发店铺中只抓取最新测试数据。

两种排序方式的区别

配置同步对象
updatedAt最近修改过的产品
createdAt最近创建的产品

如果产品创建后长期没有修改,updatedAt 和 createdAt 得到的结果可能不同。

因此,在写同步逻辑前,先明确你真正需要的是:

最近创建的产品

还是:

最近更新的产品

在 Shopify 安装流程中使用

找到 Shopify Shop 安装 Action

在 Gadget 中打开 Shopify Shop 安装相关的 Action。

这个 Action 会在应用安装到 Shopify 店铺后执行。字幕中的配置位于安装成功后的处理逻辑中。

在安装成功后调用 Shopify 数据同步,并传入同步限制参数。

示意配置如下:

{
  syncLast: 2,
  syncLastBy: "updatedAt"
}

实际 Action 名称和参数结构可能根据 Gadget 项目模板不同而变化,应以当前项目自动生成的 API 和文档为准。

安装到开发店铺

选择一个 Shopify Development Store 安装应用。

安装完成后,Gadget 会启动同步流程。

如果同步参数是:

syncLast = 2
syncLastBy = updatedAt

那么 Gadget 数据库中应该只出现最近更新的两个父级产品。

检查 Product 数据

打开 Gadget 中的 Shopify Product 数据模型。

确认:

  • 产品记录数量符合限制。
  • 产品是最近更新的记录。
  • 产品标题和状态正确。
  • 产品的时间字段符合预期。

检查 Product Variant 数据

再打开 Shopify Product Variant 数据模型。

此时变体数量可能大于产品数量,这是正常现象。

例如:

2 个产品
20 个产品变体

并不表示 syncLast 失效。

它只说明这两个产品一共包含 20 个变体。

Gadget 编辑器中的同步选项

Sync all data

在 Gadget 安装页面中,可以通过下拉菜单选择:

Sync all data

这个操作会同步全部可用数据。

适合以下情况:

  • 正式初始化开发环境。
  • 需要完整测试产品目录。
  • 需要构建完整的本地索引。
  • 需要验证全部父子记录关系。

但如果店铺产品很多,不建议在每次开发测试时都使用完整同步。

Sync recent data

Gadget 编辑器中的:

Sync recent data

默认只同步最近的 10 条父级记录。

这和代码中显式设置 syncLast 的思路类似。

例如:

Sync recent data
→ 同步最近 10 个 Product
→ 同步这 10 个 Product 的全部 Variant

因此,后台页面显示 10 个产品,但变体可能超过 10 条。

两个按钮的区别

操作默认行为
Sync recent data同步最近 10 条父级记录
Sync all data同步全部数据

如果需要不同的数量,应该使用同步 API 配置,而不是依赖后台按钮的默认值。

使用 syncSince 做时间增量同步

syncSince 的作用

除了按数量限制同步,还可以按时间限制同步。

syncSince 用于指定一个时间点,只同步这个时间点之后的数据。

示意配置:

{
  syncSince: "2026-09-01T00:00:00Z"
}

它表达的意思是:

只同步 2026 年 9 月 1 日之后发生变化的记录

适合以下场景:

  • 每天同步前一天的数据。
  • 应用中断后从指定时间恢复。
  • 只同步最近一段时间的变更。
  • 避免重复同步整个产品目录。
  • 构建定期增量同步任务。

syncSince 与 syncLast 的区别

参数作用
syncLast按数量限制最近几条父级记录
syncLastBy决定按创建时间还是更新时间排序
syncSince按时间点限制要同步的记录

如果你只需要开发环境中的少量测试数据,可以使用:

syncLast

如果你需要同步某个时间点之后的变化,可以使用:

syncSince

不要同时依赖错误的时间字段

如果业务关心的是“最近修改过的产品”,就应使用更新时间逻辑。

如果业务关心的是“最近新建的产品”,就应使用创建时间逻辑。

不要因为字段名称相似,就把创建时间和更新时间混用。

同步 API 的默认行为

不设置限制时会同步全部数据

字幕特别强调,如果调用同步 API 时没有指定:

syncLast

或:

syncSince

默认行为仍然是同步全部数据。

也就是说,下面这种调用没有数量限制:

{}

如果你只想同步少量数据,必须显式传入同步限制。

不能假设默认就是最近数据

后台页面中的 Sync recent data 默认同步最近 10 条父级记录,但这不代表所有同步 API 默认都只同步 10 条。

需要区分:

后台按钮的默认行为

和:

同步 API 的默认行为

在代码中,如果没有写 syncLast 或 syncSince,就不要假设它会自动限制数据量。

任何 Shopify 模型都可以使用

不只适用于产品

字幕中提到,这套同步配置不仅适用于 Shopify Product。

只要是 Gadget 支持的 Shopify 模型,都可以根据当前模型和 API 能力使用同步限制。

例如:

  • Product。
  • Product Variant。
  • Customer。
  • Order。
  • Collection。
  • Inventory 相关模型。
  • Shopify 其他支持同步的资源。

具体可用字段和排序方式,应以当前 Gadget 模型设置和 Shopify API 支持情况为准。

Gadget 处理排序兼容性

即使某个 Shopify API 资源本身不支持按照指定时间字段排序,Gadget 也可能在后台完成排序和筛选,再返回最近创建或最近更新的记录。

这意味着开发者不需要为每个模型都手动实现一套排序逻辑。

不过,生产环境仍应通过实际测试确认:

  • 返回记录是否符合预期。
  • 时间字段是否存在。
  • 分页和同步是否完整。
  • 子记录是否正确关联。

开发环境中的推荐同步策略

第一次安装只同步少量数据

开发阶段可以使用:

{
  syncLast: 2,
  syncLastBy: "updatedAt"
}

这样能快速获得少量产品,方便测试:

  • 产品读取。
  • 产品详情。
  • 产品变体。
  • 产品图片。
  • 数据关联。
  • UI 渲染。

需要新建商品时切换为 createdAt

如果你刚刚创建了几个测试产品,可以临时使用:

{
  syncLast: 2,
  syncLastBy: "createdAt"
}

这样更容易找到刚创建的测试产品。

产品目录准备好后再同步全部

当数据模型、权限和应用逻辑已经稳定后,再执行:

Sync all data

不要在每次修改代码后都同步完整产品目录。

生产环境中的推荐同步策略

初始同步与持续同步分开设计

生产应用通常需要区分两种任务:

初始同步

和:

持续更新

初始同步用于把店铺已有数据导入应用。

持续更新用于处理之后新增或修改的数据。

初始同步可以根据店铺规模选择:

  • 全量同步。
  • 分批同步。
  • 按时间范围同步。
  • 按数量限制同步。

持续更新则可以结合:

  • Shopify Webhook。
  • 定时增量同步。
  • syncSince。
  • Gadget 数据同步任务。

Shopify 官方资料也将实时同步和周期性导入视为不同场景,产品变化频繁的大型目录通常需要更及时的数据更新策略。

避免把测试配置直接上线

开发阶段的配置可能是:

{
  syncLast: 2
}

上线后如果忘记修改,生产应用就只会同步两个产品。

发布前检查:

  • 是否仍然设置了开发数量限制。
  • 是否需要全量初始化。
  • 是否应该使用 syncSince。
  • 是否需要根据店铺规模分批同步。
  • 是否需要通过 Webhook 处理后续变化。

处理产品和变体数据

父级产品决定同步范围

同步数量限制只应用于父级产品。

例如:

syncLast: 2

表示选择两个 Product。

然后,Gadget 会同步这两个产品下的全部 Product Variant。

变体不会被单独截断

如果第一个产品有 100 个变体,第二个产品有 5 个变体:

2 个 Product
105 个 Product Variant

这是预期行为。

系统不会把第一个产品的变体只截取一部分,因为这样可能导致产品数据不完整。

需要控制变体数量怎么办

如果应用只需要少量变体,就不能简单依赖 syncLast。

可以考虑:

  • 只同步少量父级产品。
  • 在应用查询时筛选变体。
  • 只保存业务需要的变体字段。
  • 设计单独的变体处理流程。
  • 根据库存或状态在应用层过滤。

不要误以为 syncLast 可以限制所有父级和子级记录的总数量。

实际测试步骤

测试同步两个产品

在 Shopify 开发店铺中准备多个产品,并修改其中一些产品。

配置:

{
  syncLast: 2,
  syncLastBy: "updatedAt"
}

安装应用并等待同步完成。

然后检查 Gadget Product 数据模型。

预期结果:

Product 数量为 2

这两个产品应该是最近更新的两个产品。

检查产品变体

打开 Product Variant 数据模型。

预期结果是:

变体数量可能大于 2

只要这些变体都属于那两个同步进来的产品,结果就是正确的。

测试 Sync recent data

在 Gadget 安装页面点击:

Sync recent data

然后检查 Product 数据。

预期结果是最近 10 个父级产品。

如果产品变体数量超过 10,不需要认为同步出错。

测试 Sync all data

从同步按钮的下拉菜单中选择:

Sync all data

等待同步完成后,检查 Product 数量是否与 Shopify 店铺目录一致。

产品量较大时,同步可能需要更长时间,应避免在开发测试中频繁执行全量同步。

测试 syncSince

设置一个时间点:

{
  syncSince: "2026-09-01T00:00:00Z"
}

然后检查只有该时间点之后创建或更新的记录进入同步结果。

测试时要注意时区和时间字段,最好统一使用 ISO 8601 和 UTC 时间。

常见错误

误以为 syncLast 限制所有记录

错误理解:

syncLast: 2

等于只同步两条数据库记录。

正确理解:

syncLast: 2

只限制两个父级记录,父级记录的所有子记录仍然会被同步。

忘记指定 syncLast

如果代码中没有指定 syncLast 或 syncSince,同步 API 默认可能会执行全量同步。

开发环境中建议显式配置限制,避免一次导入过多数据。

把 Sync recent data 当成 API 默认行为

后台按钮默认同步最近 10 条父级记录,但这不代表代码中的同步 API 也默认只同步 10 条。

代码和后台按钮需要分别理解和测试。

把 createdAt 和 updatedAt 混淆

如果你要测试最近修改的商品,应使用 updatedAt。

如果你要测试最近新建的商品,应使用 createdAt。

只检查产品,不检查变体

产品同步完成后,必须同时检查 Product Variant。

因为产品本身可能只有几条,但变体数量可能非常多。

总结

这份字幕演示的是 Gadget Shopify Sync API 的同步范围控制功能。

核心参数包括:

syncLast
syncLastBy
syncSince

它们分别用于:

  • 限制最近同步的父级记录数量。
  • 指定按创建时间还是更新时间排序。
  • 只同步某个时间点之后的数据。

最重要的行为是:

syncLast 只限制父级记录,不限制子级记录

例如:

同步 2 个 Product
→ 同步这 2 个 Product 的全部 Product Variant

此外,Gadget 编辑器中的同步按钮也有不同含义:

  • Sync recent data 默认同步最近 10 条父级记录。
  • Sync all data 执行全量同步。
  • 同步 API 如果没有指定 syncLast 或 syncSince,默认仍可能同步全部数据。

在开发阶段,建议先使用少量产品进行测试,减少同步时间和资源消耗。等数据模型与应用逻辑稳定后,再根据生产店铺规模选择全量同步、时间增量同步或 Webhook 持续更新。

参考资料

citation:Get product variant data

citation:Setting up agentic storefronts and choosing product data sync methods

citation:Shopify Winter ’25 产品数据更新