![](/img/trans.png)
[英]"Error loading documents" on Cloud Firestore when console left open for a while
[英]"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( REST , RPC )获得。
这是文档,解释相同。
导入数据时需要注意的要点:
此外,我希望您通过这个答案转到 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.