Google Firebase: получать, обновлять или создавать документы с использованием Python - PullRequest
0 голосов
/ 27 февраля 2019

Я не могу получить, обновить или создать документы в базе данных Google Firebase (Cloud Firestore) с помощью Python.

Что у меня есть:

A) База данных с коллекцией идокументы (вставленные вручную в Интернете): enter image description here

B) Файл учетных данных JSON сохранен как test.json (в документации его часто называют path/to/serviceKey.json), который выглядит следующим образомthis (отредактировано):

{
  "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": "test-admin@test-6f02d.iam.gserviceaccount.com",
  "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 документа, я могу получить доступ к идентификатору документов

<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?

Я пытался подписаться на этот блог и документация (но у нее нет примеров) и несколько ответов здесь на SO, но безуспешно.

Заранее спасибо.

1 Ответ

0 голосов
/ 28 февраля 2019

Еще одна ночь, и я могу ответить самому себе (спасибо Дугу за подсказку в обсуждении):

Проблема для меня заключалась в том, что есть две аналогичные документации (для части 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)
...