#python #mongodb #azure-functions #azure-cosmosdb-mongoapi #timer-trigger
#python #mongodb #azure-функции #azure-cosmosdb-mongoapi #таймер-триггер
Вопрос:
Я новичок в функциях Azure и Azure в целом. Я хочу, чтобы мой фрагмент кода выполнялся согласно моему расписанию ежечасно или ежедневно один раз, поэтому решил продолжить работу с функциями azure.
Моя цель — взять данные из API, а затем сохранить их в cosmos db mongo api в Azure.
Я могу достичь своей цели с помощью обычных кодов python, но когда я интегрирую его в функции azure. Мне трудно ее запустить.
Ниже приведен мой код для вашей справки.
__init__.py
print("Starting Importing Libraries")
import os
import pandas as pd
import numpy as np
import requests
import json
import pymongo
from azure.storage.blob import BlockBlobService
from azure.common.credentials import ServicePrincipalCredentials
from azure.mgmt.resource import ResourceManagementClient
from azure.mgmt.datafactory import DataFactoryManagementClient
from azure.mgmt.datafactory.models import *
from datetime import datetime, timedelta
import time
import azure.functions as func
print("Completing Importing Libraries")
def execute_timer():
#Business Logic to take the data from API and insert it to mongo db.
data_insert = mycol.insert_many(final_df)
return data_insert
def main(mytimer: func.TimerRequest, outdoc: func.Out[func.Document]):
utc_timestamp = datetime.datetime.utcnow().replace(
tzinfo=datetime.timezone.utc).isoformat()
if mytimer.past_due:
logging.info('The timer is past due!')
logging.info('Python timer trigger function ran at %s', utc_timestamp)
try:
# Get Blog feeds
outdata = {}
outdata['items'] = execute_timer()
# logging.info(outdata) # for debug
# Store output data using Cosmos DB output binding
outdoc.set(func.Document.from_json(json.dumps(outdata)))
except Exception as e:
logging.error('Error:')
logging.error(e)
function.json
{
"scriptFile": "__init__.py",
"bindings": [
{
"name": "mytimer",
"type": "timerTrigger",
"direction": "in",
"schedule": "0 */5 * * * *"
},
{
"direction": "out",
"type": "cosmosDB",
"name": "outdoc",
"databaseName": "DB",
"collectionName": "example_test",
"leaseCollectionName": "leases",
"createLeaseCollectionIfNotExists": true,
"connectionStringSetting": "mongodb://*****",
"createIfNotExists": true
}
]
}
Когда я запускаю его после развертывания в Azure, т.е. test run:
below error is obtained:
020-08-20T04:48:18Z [Information] Executing 'Functions.TimerTrigger_2' (Reason='This function was programmatically called via the host APIs.', Id=123586b0-41d5-4ebc-87eb-bee1c8cd3ae2)
2020-08-20T04:48:18Z [Verbose] Sending invocation id:123586b0-41d5-4ebc-87eb-bee1c8cd3ae2
2020-08-20T04:48:18Z [Verbose] Posting invocation id:123586b0-41d5-4ebc-87eb-bee1c8cd3ae2 on workerId:767e33e5-dc7f-400c-977b-fdaa108904f2
2020-08-20T04:48:18Z [Error] Executed 'Functions.TimerTrigger_2' (Failed, Id=123586b0-41d5-4ebc-87eb-bee1c8cd3ae2, Duration=27ms)
2020-08-20T04:50:00Z [Information] Executing 'Functions.TimerTrigger_2' (Reason='Timer fired at 2020-08-20T04:50:00.0009948 00:00', Id=04302a29-7521-42aa-a3c0-0b6d6a139d63)
2020-08-20T04:50:00Z [Verbose] Sending invocation id:04302a29-7521-42aa-a3c0-0b6d6a139d63
2020-08-20T04:50:00Z [Verbose] Posting invocation id:04302a29-7521-42aa-a3c0-0b6d6a139d63 on workerId:767e33e5-dc7f-400c-977b-fdaa108904f2
Кроме того, в моем локальном, когда я его запускаю. Не выполняется переход к execute_timer() для выполнения.
Есть ли что-нибудь, что я здесь делаю?
Кроме того, когда я пытаюсь запустить функцию хоста в окне терминала как «func host start», тогда в окне появляется ошибка ниже.
func : The term 'func' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or
if a path was included, verify that the path is correct and try again.
At line:1 char:1
func host start
~~~~
CategoryInfo : ObjectNotFound: (func:String) [], CommandNotFoundException
FullyQualifiedErrorId : CommandNotFoundException
Есть ли что-нибудь, что я делаю здесь, или мне нужно сделать что-то иначе. Пожалуйста, предложите!
Комментарии:
1. Что вы получите, когда вы напрямую запустите func в своей локальной команде?
2. Я получу сообщение об ошибке ниже:
3. функция : термин ‘func’ не распознается как имя командлета, функции, файла сценария или работоспособной программы. Проверьте написание имени или, если был указан путь, убедитесь, что путь указан правильно, и повторите попытку. В строке: 1 символ: 1 запуск узла функции ~~ ~ ~ CategoryInfo: ObjectNotFound: (функция: строка) [], исключение CommandNotFoundException FullyQualifiedErrorId: исключение CommandNotFoundException