PubSubcloud函数写入cloud Firestore



我有一个Pub/Sub主题,我的树莓派将向其发布传感器数据。此云函数记录发布的数据:

main.py

import sys
def log_sensor_data(event, context):
import base64
if 'data' in event:
message = base64.b64decode(event['data']).decode('utf-8')
# if 'sensor data ready' in message:          # check which message is listed
#     print('lets store the data in firebase...')
if 'attributes' in event:                           # NOTE: the key of 'attributes' is plural even though Pub/Sub uses the command line "--attribute" (singular)
sensorName = 'unknown sensor'                   # default values
temperature = -1
humidity = -1
if 'sensorName' in event['attributes']:
sensorName = event['attributes']['sensorName']

if 'temperature' in event['attributes']:
temperature = event['attributes']['temperature']

if 'humidity' in event['attributes']:
humidity = event['attributes']['humidity']

print(f'sensor name: {sensorName}')
print(f'temperature: {temperature}')
print(f'humidity: {humidity}')

但是,当我尝试添加代码将数据写入Firestore数据库时,我运气不佳。

仅添加from google.cloud import firestore就会产生错误ImportError: cannot import name 'firestore' from 'google.cloud' (unknown location)

是使用本指南为Firestore编写云函数的唯一选项,https://firebase.google.com/docs/functions?我真的很想继续使用Python。

感谢您的指导!

谢谢,Ryan

您可以像这样放置数据。

import firebase_admin
from firebase_admin import credentials
from firebase_admin import firestore
# Use a service account
cred = credentials.Certificate('<key>.json')
firebase_admin.initialize_app(cred)
db = firestore.client()
doc_ref = db.collection(u'users').document(u'alovelace')
doc_ref.set({
u'first': u'Ada',
u'last': u'Lovelace',
u'born': 1815
})

我将问题分为三部分。

第一个部分-确保Firestore和API在正确的项目中启动并运行。

第二个部分-执行云功能的服务帐户-应该具有与Firestore合作的相关IAM角色。请参阅-预定义Firestore IAM角色此处需要检查的三件事:

  • 项目id-firestore和云功能可能在不同的项目中
  • IAM角色—例如—roles/datastore.user
  • 云功能的服务帐户

第三部分-云功能代码。

API描述:用于Google Cloud Firestore 的Python客户端

首先-requirements.txt中的正确导入-例如google-cloud-firestore>=2.0.2

然后是一些代码元素。

1/进口:

from google.cloud import firestore

2/在函数体之外创建Firestore客户端,因此在内存中加载/创建云函数的新实例时会创建一次:

DB = firestore.Client(project=<the project id where the firestore is located>)

3/函数代码(在函数体中(-只是一个片段示例:

...
fs_file_ref = DB.document(<collection name>/<document id>) 
...

请记住,根据API版本的不同,函数签名可能与我提供的示例不同。

为了用Python编写一个云函数来与PubSub和Cloud Firestore交互,请创建一个包含两个文件的文件夹,分别名为main.pyrequirements.txt

main.py

from google.cloud import firestore
client = firestore.Client(project='My_PROJECT_ID')
def hello_fire(event, context):
import base64
print(f'This function was triggered by messageId {context.event_id}, published at {context.timestamp} to {context.resource["name"]}!')
# google's hello world log example
if 'data' in event:
name = base64.b64decode(event['data']).decode('utf-8')
else:
name = 'World'
print(f'Hello {name}!')

# write to a new doc in Firestore
doc = client.collection('MY_FIRESTORE_COLLECTION').document('NEW_UNIQUE_DOC_NAME')
doc.set({
'first': 'Ada',
'last': 'Lovelace',
'born': 1815
})

需求.txt

google-cloud-firestore>=2.1.3

设置client变量时,您可以使用以下终端命令获得所有Google Cloud项目ID的列表:gcloud projects list

要部署该功能,请打开一个终端和cd到您的文件夹,然后键入:

gcloud functions deploy hello_fire --runtime python39 --trigger-topic MY_PUBSUB_TOPIC

请注意,当您进行部署时,您将使用主题的短名称(例如:"garden sensors"(,而不是长名称(例如,"projects/MY_PROJECT_ID/topics/garden sensers"(。

确保您在项目中启用了Cloud Firestore,并设置了PubSub主题。

感谢@Ranveer和@al-dann帮我解决了这个问题。

相关内容

  • 没有找到相关文章

最新更新