Google Firebase:使用Python获取,更新或创建文档

问题描述 投票:0回答:1

我无法使用Python在Google Firebase(Cloud Firestore)数据库中获取,更新或创建文档。

是)我有的:

A)具有集合和文档的数据库(在Web上手动插入):enter image description here

B)Credential JSON文件保存为test.json(文档中经常称为path/to/serviceKey.json),看起来像这样(编辑):

{
  "type": "service_account",
  "project_id": "test-6f02d",
  "private_key_id": "fffca ... 5b7",
  "private_key": "-----BEGIN PRIVATE KEY-----\n ... 1IHE=\n-----END PRIVATE KEY-----\n",
  "client_email": "[email protected]",
  "client_id": "112 ... 060",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/ ... .gserviceaccount.com"
}

此用户具有角色所有者。

C)安装firebase_admin(使用virtualenv,pip),我可以这样做:

import firebase_admin
from firebase_admin import credentials, firestore
databaseURL = {'databaseURL': "https://test-6f02d.firebaseio.com"}
cred = credentials.Certificate("test.json")
firebase_admin.initialize_app(cred, databaseURL)
<firebase_admin.App object at 0x7f20056534e0>

以下是有效的:

db = firestore.client()
for k in db.collection('items').get():
    print(k)

我收到3个文件,我可以访问文件的ID

<google.cloud.firestore_v1beta1.document.DocumentSnapshot object at 0x7f2003bebc18>
<google.cloud.firestore_v1beta1.document.DocumentSnapshot object at 0x7f2003bebdd8>
<google.cloud.firestore_v1beta1.document.DocumentSnapshot object at 0x7f2003bebcf8>
print(k.id)
a3BxcpWpavHmuz6DpZH3

但是,这是我能得到的最大值。

1)我不知道如何访问文档的值。像这样的东西:

from firebase_admin import db
ref = db.reference('items')
print(ref)
<firebase_admin.db.Reference object at 0x7f20013b2828>
# GET?
ref.get()
# empty

2)我不知道如何直接访问这些值(例如,使用浏览器或requests),例如:

https://test-6f02d.firebaseio.com/items.json

回报

{
  "error" : "Permission denied"
}

3)我不知道如何在items集合中更新现有文档或创建新文档。

# UPDATE?
# PUSH?

我试图跟随this blogthe documentation(但它没有例子)和SO的几个答案,但没有任何成功。

提前致谢。

python firebase google-cloud-firestore firebase-admin
1个回答
2
投票

另一个晚上,我可以自己回答(感谢Doug在讨论中的暗示):

对我来说问题是有两个类似的文档(对于Python部分,第二个比Python更广泛)。我发现第一个更有帮助,但有时我也需要使用第二个的一部分:

1)访问文件:

import firebase_admin
from firebase_admin import credentials, firestore
databaseURL = {
     'databaseURL': "https://test-6f02d.firebaseio.com"
}
cred = credentials.Certificate("test.json")
firebase_admin.initialize_app(cred, databaseURL)

database = firestore.client()
col_ref = database.collection('items') # col_ref is CollectionReference
results = col_ref.where('name', '==', 'Pepa').get() # one way to query
results = col_ref.order_by('date',direction='DESCENDING').limit(1).get() # another way - get the last document by date
for item in results:
    print(item.to_dict())
    print(item.id)
# item is DocumentSnapshot
# note: the documentation says get() is depreciated in favour of stream(), however stream() did not work for me

2)仍然不知道,但我不需要它1)工作正常。

3)更新或创建文档:

# Continuing from 1)

# Udpdate:
doc = col_ref.document(item.id) # doc is DocumentReference
field_updates = {"description": "Updated description"}
doc.update(field_updates)

# Create:
import datetime
new_values = {
    "name": "Newbie",
    "description": "Shiny New Document",
    "date": datetime.datetime.now()
}
col_ref.document().create(new_values)
© www.soinside.com 2019 - 2024. All rights reserved.