我有一个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.py
和requirements.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帮我解决了这个问题。