繁体   English   中英

使用 Python 从 Firestore 加载文档时出现“错误的应用程序引用”

[英]"Wrong app reference" when loading documents from Firestore with Python

我在 GCP 项目“A”中有一个数据库,它是从项目“B”中的另一个数据库的副本创建的。 这是通过 GCP 的 Cloud Firestore 托管导出和导入服务实现的。

尝试从项目“A”中的数据库加载特定集合的文档时,出现错误:

ValueError                                Traceback (most recent call last)
<ipython-input-16-935f61174138> in <module>()
      1 collection_docs = db.collection("<collection>").stream()
----> 2 for doc in collection_docs:
      3   print(doc.id)

5 frames
/usr/local/lib/python3.7/dist-packages/google/cloud/firestore_v1/_helpers.py in reference_value_to_document(reference_value, client)
    245     if document._document_path != reference_value:
    246         msg = WRONG_APP_REFERENCE.format(reference_value, client._database_string)
--> 247         raise ValueError(msg)
    248 
    249     return document

ValueError: Document 'projects/<project B>/databases/(default)/documents/<another collection>/<document>' does not correspond to the same database ('projects/<project A>/databases/(default)') as the client.

请注意, <another collection>在来自<collection>的文档中被引用

为什么引用一直指向旧数据库?

更新:事实证明初始导出是正确的并且引用已正确更新,但之后,在使用错误的 Python 脚本更新其他字段时,引用被不必要且错误地“更新”到旧项目。

获取该字段的正确方法是:

db.document(<document reference>.path)

这个问题仍然存在:

是否可以在不带参考的情况下加载文件?

这是产生错误的 Python 片段:

cred = credentials.ApplicationDefault()
firebase_admin.initialize_app(cred, {
  'projectId': <project A>,
})

db = firestore.client()

collection_docs = db.collection("<collection>").stream()
for doc in collection_docs:
  print(doc.id)

您可以使用 Cloud Firestore 管理的导出和导入服务导出所有文档或仅导出特定的 collections。从一个 Cloud Firestore 数据库导出的数据可以跨项目导入到另一个 Cloud Firestore 数据库。 Cloud Firestore 托管导出和导入服务可通过gcloud 命令行工具和 Cloud Firestore API( RESTRPC )获得。

这是文档,解释相同。

导入数据时需要注意的要点:

  • 导入数据时,所需的索引会使用数据库的当前索引定义进行更新。 导出不包含索引定义。
  • 导入不会分配新的文档 ID。 导入使用导出时捕获的 ID。 在导入文档时,会保留其 ID 以防止 ID 冲突。 如果已存在具有相同 ID 的文档,则导入会覆盖现有文档。

此外,我希望您通过这个答案转到 go,社区成员解释了如何使用一个主要项目的 Firestore 数据库中的值,以便使用引用查询辅助项目的 Firestore 数据库。 尝试看看是否可以让它正常工作而不会出错,因为很可能会指向 Firestore 中另一个项目的文档。

更新

我通过创建两个项目 A 和 B 重现了您的案例。在我的案例中,项目 A 有一个 Firestore 数据库,其中包含我要导出到项目 B 的所有数据。我按照此文档在项目之间移动数据并成功完成. 在此之后,我在项目 B 中创建了一个服务帐户,并授予Owner, Service Account Token Creator permissions 生成私钥文件并将环境变量GOOGLE_APPLICATION_CREDENTIALS设置为包含服务帐户密钥的 JSON 文件的文件路径,如下所示:

export GOOGLE_APPLICATION_CREDENTIALS="/path/to/service-account-file.json"

之后,我编写了以下 Python 脚本,它对我来说工作正常,它打印了我的 Firestore 数据库的文档 ID(从项目 A 导出并导入到项目 B),没有任何错误。

firebase.py

import firebase_admin
from firebase_admin import auth,firestore
from firebase_admin import credentials
cred = credentials.ApplicationDefault()
firebase_admin.initialize_app(cred, {
 'projectId': "projectB’sID",
})
db = firestore.client()
collection_docs = db.collection("collection-name").stream()
for doc in collection_docs:
 print(doc.id)
 

要求.txt

firebase_admin=5.0.2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM