【问题标题】:Firestore schema migration between projects项目之间的 Firestore 架构迁移
【发布时间】:2020-03-07 02:20:41
【问题描述】:

我有一个 Firebase 项目,它基本上有两个环境:StagingProduction。我组织它们的方式是创建不同的 Firebase 项目。我的每个项目都使用 Firebase Cloud FunctionsFirestore。除此之外,我的每个项目都与特定的 GIT 分支相关联。这两个分支都集成到Google Cloud Build 中的 CI/CD 管道中。

所以,为了绝对清楚,我将分享一个简单的图表:

如您所见,我将云功能的源代码置于源代码控制之下,无需担心。当我遇到以下情况时,问题就出现了:

  1. 暂存上存在 Firestore 架构更改
  2. 云功能(在Staging上)已调整为新架构。
  3. staging 分支合并到 production
  4. 由于 生产 上的旧 Firestore 架构,新功能无法按预期工作。

为了解决这个问题,我需要手动转到 生产 Firestore 实例并在那里调整架构(存在弄乱生产数据的风险)。

在完美的情况下,我会自动执行该操作,并将现有项目数据调整为合并后动态进入的新模式。

这有可能吗?类似migrations in .NET Core

【问题讨论】:

    标签: firebase google-cloud-firestore


    【解决方案1】:

    Cloud Firestore 没有架构 - 文档没有强制架构。代码能够随时编写它想要的任何字段。 (对于 Web 和移动客户端,这由安全规则控制,但对于后端代码,则没有限制。)因此,Cloud Firestore 中没有正式迁移。

    文档的“架构”由读写这些文档的代码有效地定义。这意味着将数据迁移到新格式意味着您将不得不编写代码来执行所需的更改。真的没有简单的方法解决这个问题。您真正能做的就是设计您的更新,以便在将它们移动到另一个环境时它们不会破坏现有代码。这意味着您的代码应该对中断性更改具有弹性,或者只是在所有代码都已更新以处理这些更改之前不执行中断性更改。

    【讨论】:

      【解决方案2】:

      您必须使用 Google Cloud 下载 Firestore 数据的存档。自己对存档运行迁移脚本,然后上传存档以恢复您的 Firestore 数据库。

      https://cloud.google.com/firestore/docs/manage-data/export-import

      Google Cloud 为您提供了大量用于管理 Firestore 服务的命令行访问权限。

      // manage indexes
      gcloud firestore indexes
      
      // export all data to a bucket
      gcloud firestore export gs://[BUCKET_NAME]
      
      // import data from a bucket
      gcloud firestore import gs://[BUCKET_NAME]/[filename]
      
      // manage admin "functions" currently running (i.e. kill long processes)
      gcloud firestore operations
      

      从 Google Cloud 存储桶下载/上传您的 JSON 存档

      // list files in a bucket
      gsutil ls gs://[BUCKET_NAME]
      
      // download
      gsutil cp gs://[BUCKET_NAME]/[filename] .
      
      // upload
      gsutil cp [filename] gs://[BUCKET_NAME]/[filename]
      

      一旦您将 Google Cloud 设置为可从您的构建脚本访问。可以自动化数据迁移脚本来下载、转换和上传数据。

      建议在您的 Firestore 中维护一份“迁移”文档,以便跟踪需要执行的迁移恢复。

      为避免繁重的迁移任务,请尝试向文档添加“版本”属性,然后使用查询构建器上的转换器回调将数据更改为“客户端”上的最新架构。虽然这不会帮助您处理 Firestore 规则或函数的更改。进行主要是装饰性的微小更改通常更容易。

      【讨论】:

        猜你喜欢
        • 2019-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-28
        • 1970-01-01
        • 2013-10-06
        • 2017-08-29
        • 2015-07-20
        相关资源
        最近更新 更多