如何将cloud firestore中的数据导入本地模拟器?

use*_*624 34 firebase-tools google-cloud-functions google-cloud-firestore

我希望能够在本地运行云函数并针对生产数据的副本进行调试。有没有办法将在线的数据复制到本地firestore模拟器?

小智 92

这可以通过现有项目的终端中的一组命令来完成:

1.登录firebase和Gcloud:

firebase login
gcloud auth login
Run Code Online (Sandbox Code Playgroud)

2. 查看您的项目列表并连接到一个:

firebase projects:list
firebase use your-project-name

gcloud projects list
gcloud config set project your-project-name
Run Code Online (Sandbox Code Playgroud)

3. 使用所选名称将您的生产数据导出到 gcloud 存储桶:

gcloud firestore export gs://your-project-name.appspot.com/your-choosen-folder-name
Run Code Online (Sandbox Code Playgroud)

4.现在将此文件夹复制到您的本地计算机,我直接在functions文件夹中执行此操作:

cd functions
gsutil -m cp -r gs://your-project-name.appspot.com/your-choosen-folder-name .
Run Code Online (Sandbox Code Playgroud)

5. 现在我们只想导入这个文件夹。这应该适用于基本命令,这要归功于 Firebase 团队https://github.com/firebase/firebase-tools/pull/2519 的最新更新

firebase emulators:start --import ./your-choosen-folder-name
Run Code Online (Sandbox Code Playgroud)

查看我关于它的关于 Medium 的文章和一个速记脚本来为你完成这项工作https://medium.com/firebase-developers/how-to-import-production-data-from-cloud-firestore-to-the-本地模拟器-e82ae1c6ed8

注意:最好为它使用不同的存储桶,因为复制到您的项目存储桶将导致在您的 firebase 存储中创建文件夹。
如果您对 gsutil 参数(如 )感兴趣-m,可以通过执行 来查看它们的描述gsutil --help


Met*_*iel 21

我的方法有点手动,但它确实有效。我已经在这个有用的 Github 线程中分享了它,但如果你觉得它们有用,我会列出我在这里做的步骤:

  1. 转到我本地的 Firebase 项目路径。
  2. 使用以下命令启动模拟器: firebase emulators:start
  3. 使用提供的按钮在http://localhost:4000/firestore 上使用GUI 手动创建一些模型数据:+ Start Collection+ Add Document
  4. 使用以下方法在本地导出此数据: emulators:export ./mydirectory
  5. 关于位于Firebase Database / Cloud Firestore的项目数据,我导出了一个这样的集合:gcloud firestore export gs://my-project-bucket-id.appspot.com --collection-ids=myCollection导出现在位于Firebase Storage下以时间戳为名称的文件夹中(我没有在测试中使用前缀)
  6. 将此文件夹下载到本地驱动器:gsutil cp -r gs://my-project-bucket-id.appspot.com/myCollection ./production_data_export注意:我是在 Windows 环境中执行此操作... gsutil将抛出此错误:“OSError:文件名、目录名或卷标语法不正确”如果文件夹包含无效字符Windows 中的文件夹名称(即冒号)或此错误:“OSError: Invalid argument.9.0 B]”如果文件夹中的内部文件也包含无效字符。为了能够在本地下载导出,请使用有效的 Windows 名称(即删除冒号)重命名它们,如下所示:gsutil mv gs://my-project-bucket-id.appspot.com/2020-05-22T02:01:06_86152 gs://my-project-bucket-id.appspot.com/myCollection
  7. 下载后,模仿本地导出结构,将文件夹重命名为本地导出文件夹firestore_exportfirebase-export-metadata.json从本地导出文件夹复制文件。只是为了直观,这是我得到的结构:
$ tree .
.
??? local_data_export
?   ??? firebase-export-metadata.json
?   ??? firestore_export
?       ??? all_namespaces
?       ?   ??? all_kinds
?       ?       ??? all_namespaces_all_kinds.export_metadata
?       ?       ??? output-0
?       ??? firestore_export.overall_export_metadata
??? production_data_export
    ??? firebase-export-metadata.json
    ??? firestore_export
        ??? all_namespaces
        ?   ??? kind_myCollection
        ?       ??? all_namespaces_kind_myCollection.export_metadata
        ?       ??? output-0
        ?       ??? output-1
        ??? firestore_export.overall_export_metadata

8 directories, 9 files
Run Code Online (Sandbox Code Playgroud)
  1. 最后,启动本地模拟器指向这个要导入的生产数据: firebase emulators:start --import=./mock_up_data/production_data_export/
  2. 您应该在以下位置看到导入的数据:http://localhost:4000/firestore/

目前这应该对读者有所帮助,而我们正在等待 Firebase 人员提供更强大的解决方案。

  • 如果没有验证用户数据,仅导出数据库可能毫无用处。为此,请在本地项目终端中使用:% firebase auth:export account.json --format=json。另请参阅:https://firebase.google.com/docs/cli/auth (2认同)
  • 小提示:在步骤 #4 中,整个命令是 `firebase emulators:export ./mydirectory`。我知道这很明显,但我确实有一分钟感到困惑。 (2认同)

小智 10

您可以使用firestore-backup-restore将生产数据导出和导入为 JSON 文件。

我写了一个快速的 hack 来允许在 Firebase Simulator Firestore 实例中导入这些 JSON。

我提出了一个拉取请求并同时制作了这个npm 模块

你可以这样使用它:

const firestoreService = require('@crapougnax/firestore-export-import')
const path = require('path')

// list of JSON files generated with the export service
// Must be in the same folder as this script
const collections = ['languages', 'roles']

// Start your firestore emulator for (at least) firestore
// firebase emulators:start --only firestore

// Initiate Firebase Test App
const db = firestoreService.initializeTestApp('test', {
   uid: 'john',
   email: 'john@doe.com',
})

// Start importing your data
let promises = []
try {
   collections.map(collection =>
      promises.push(
         firestoreService.fixtures(
            path.resolve(__dirname, `./${collection}.json`),
            [],
            [],
            db,
         ),
      ),
   )
   Promise.all(promises).then(process.exit)
} catch (err) {
   console.error(err)
}
Run Code Online (Sandbox Code Playgroud)

显然,由于这些数据不会保留在模拟器中,您通常会在测试套件的 before() 函数中甚至在每次测试之前将它们注入。


san*_*eni 9

你可以使用fire-import npm 包。用于导入firestorefirebase storage


Est*_*cas 8

我能够制作一些 npm 脚本从远程导入到本地模拟器,反之亦然。

"serve": "yarn build && firebase emulators:start --only functions,firestore --import=./firestore_export",
"db:update-local-from-remote": "yarn db:backup-remote && gsutil -m cp -r gs://my-firebase-bucket.appspot.com/firestore_export .",
"db:update-remote-from-local": "yarn db:backup-local && yarn db:backup-remote && gsutil -m cp -r ./firestore_export gs://my-firebase-bucket.appspot.com && yarn run db:import-remote",
"db:import-remote": "gcloud firestore import gs://my-firebase-bucket.appspot.com/firestore_export",
"db:backup-local": "firebase emulators:export --force .",
"db:rename-remote-backup-folder": "gsutil mv gs://my-firebase-bucket.appspot.com/firestore_export gs://my-firebase-bucket.appspot.com/firestore_export_$(date +%d-%m-%Y-%H-%M)",
"db:backup-remote": "yarn db:rename-remote-backup-folder && gcloud firestore export gs://my-firebase-bucket.appspot.com/firestore_export"
Run Code Online (Sandbox Code Playgroud)

因此,您可以使用以下命令将本地 Firestore 数据导出到远程:

"serve": "yarn build && firebase emulators:start --only functions,firestore --import=./firestore_export",
"db:update-local-from-remote": "yarn db:backup-remote && gsutil -m cp -r gs://my-firebase-bucket.appspot.com/firestore_export .",
"db:update-remote-from-local": "yarn db:backup-local && yarn db:backup-remote && gsutil -m cp -r ./firestore_export gs://my-firebase-bucket.appspot.com && yarn run db:import-remote",
"db:import-remote": "gcloud firestore import gs://my-firebase-bucket.appspot.com/firestore_export",
"db:backup-local": "firebase emulators:export --force .",
"db:rename-remote-backup-folder": "gsutil mv gs://my-firebase-bucket.appspot.com/firestore_export gs://my-firebase-bucket.appspot.com/firestore_export_$(date +%d-%m-%Y-%H-%M)",
"db:backup-remote": "yarn db:rename-remote-backup-folder && gcloud firestore export gs://my-firebase-bucket.appspot.com/firestore_export"
Run Code Online (Sandbox Code Playgroud)

或者要使用远程 Firestore 数据更新本地 Firestore 数据,请执行以下操作:

npm db:update-remote-from-local
Run Code Online (Sandbox Code Playgroud)

这些操作将备份远程 Firestore 数据,制作其副本并将其存储在 Firebase 存储上。


Fra*_*len 7

没有将数据从云项目复制到本地模拟器的内置方法。由于模拟器不保留任何数据,因此您必须在每次运行时重新生成初始数据集。