簡體   English   中英

Azure 函數不執行其他 Python 函數

[英]Azure function does not execute other Python functions

我在main.py有以下代碼,這是我的項目的簡化版本,我在其中檢索一些數據,清理它並將其導出到 Azure 中的 SQL 數據庫。

問題是,當我使用 Azure 函數在本地運行它時,一切正常,我可以在終端中看到日志記錄。

但是當我使用azure start --verbose運行它時,該函數正確啟動,但我的函數export_data的執行不起作用。

簡化代碼

# import packages
# load_dotenv()

def get_data():
    # function which retrieves data


def export_data():
    # function which exports data and uses environment variables


def main(timer: func.TimerRequest) -> None:
    utc_timestamp = datetime.datetime.utcnow().replace(
        tzinfo=datetime.timezone.utc).isoformat()

    if timer.past_due:
        logging.info('The timer is past due! Writing data to database')
        export_data()

    logging.info('Python timer trigger function ran at %s', utc_timestamp)


if __name__ == "__main__":
    export_data()

我的代碼

import os
import datetime
import logging
import pandas as pd
from sqlalchemy import create_engine
from dotenv import load_dotenv
import azure.functions as func
load_dotenv()


logging.basicConfig(
    format="%(asctime)s.%(msecs)03d [%(levelname)-5s] [%(name)s] - %(message)s",
    datefmt="%Y-%m-%d %H:%M:%S",
    level=logging.INFO,
)


def get_data():
    # get data
    logging.info("retrieving data")
    url = "https://data.rivm.nl/covid-19/COVID-19_aantallen_gemeente_per_dag.csv"
    df = pd.read_csv(url, sep=";")

    return df


def export_data():
    # export data
    df = get_data()

    uid = os.environ.get("username")
    password = os.environ.get("pw")
    server = '***.database.windows.net'
    database = os.environ.get("database")
    driver = "ODBC Driver 17 for SQL Server"

    connection_string = (
        f"mssql+pyodbc://{uid}:{password}@" f"{server}:1433/{database}?driver={driver}"
    )

    engine = create_engine(connection_string)
    con = engine.connect()

    logging.info("exporting data")
    df.head(10).to_sql('covid_19', con=con, if_exists='replace')


def main(timer: func.TimerRequest) -> None:
    utc_timestamp = datetime.datetime.utcnow().replace(
        tzinfo=datetime.timezone.utc).isoformat()

    if timer.past_due:
        logging.info('The timer is past due! Writing data to database')
        export_data()

    logging.info('Python timer trigger function ran at %s', utc_timestamp)


if __name__ == "__main__":
    export_data()

函數.json :

{
  "scriptFile": "main.py",
  "bindings": [
    {
      "name": "timer",
      "type": "timerTrigger",
      "direction": "in",
      "schedule": "0 */5 * * * *"
    }
  ]
}

編輯

所以這是日志的一部分,它顯示了當我最初使用func start --verbose調用函數時運行的函數。 注意時間,它不會在整個 5 分鍾內發生,因為我的日程安排基於該時間( "schedule": "0 */5 * * * *" ):

[2020-10-23T09:23:43.339] The timer is past due! Writing data to database
[2020-10-23T09:23:43.340] retrieving data
[2020-10-23T09:23:45.323] exporting data
[2020-10-23T09:23:46.182] Python timer trigger function ran at 2020-10-23T09:23:43.332697+00:00

然后在這部分之后,該函數將根據計時器觸發器運行,但沒有任何反應:

[2020-10-23T09:25:00.009] Executing 'Functions.zyppcovid' (Reason='Timer fired at 2020-10-23T11:25:00.0076610+02:00', Id=***)
[2020-10-23T09:25:00.012] Received FunctionInvocationRequest, request ID: ***, function ID: ***, invocation ID: ***
[2020-10-23T09:25:00.013] Function is sync, request ID: ***,function ID: ***, invocation ID: ***
[2020-10-23T09:25:00.013] Python timer trigger function ran at 2020-10-23T09:25:00.012563+00:00
[2020-10-23T09:25:00.013] Successfully processed FunctionInvocationRequest, request ID: ***, function ID: ***, invocation ID: ***
[2020-10-23T09:25:00.014] Executed 'Functions.zyppcovid' (Succeeded, Id=***, Duration=6ms)

代碼已經有一個定時器觸發器的主函數def main(timer: func.TimerRequest) -> None: 所以if __name__ == "__main__":它就不能再做另一個 main 。 我在我身邊測試,如果我只是用main創建一個簡單的python代碼,它可以在main函數成功下做export_data()

您應該從 if 語句中取出 export_data()。 if 語句僅在計時器過期時才會執行。

每次運行 azure 函數時,您很可能希望 export_date() 。

試試這個(注意用戶定義的函數如何不再在 if 條件語句中,現在應該在函數運行時運行,而不僅僅是在計時器過期時):

import os
import datetime
import logging
import pandas as pd
from sqlalchemy import create_engine
from dotenv import load_dotenv
import azure.functions as func
load_dotenv()


logging.basicConfig(
    format="%(asctime)s.%(msecs)03d [%(levelname)-5s] [%(name)s] - %(message)s",
    datefmt="%Y-%m-%d %H:%M:%S",
    level=logging.INFO,
)


def get_data():
    # get data
    logging.info("retrieving data")
    url = "https://data.rivm.nl/covid-19/COVID-19_aantallen_gemeente_per_dag.csv"
    df = pd.read_csv(url, sep=";")

    return df


def export_data():
    # export data
    df = get_data()

    uid = os.environ.get("username")
    password = os.environ.get("pw")
    server = '***.database.windows.net'
    database = os.environ.get("database")
    driver = "ODBC Driver 17 for SQL Server"

    connection_string = (
        f"mssql+pyodbc://{uid}:{password}@" f"{server}:1433/{database}?driver={driver}"
    )

    engine = create_engine(connection_string)
    con = engine.connect()

    logging.info("exporting data")
    df.head(10).to_sql('covid_19', con=con, if_exists='replace')


def main(timer: func.TimerRequest) -> None:
    utc_timestamp = datetime.datetime.utcnow().replace(
        tzinfo=datetime.timezone.utc).isoformat()
    
    logging.info('Writing data to database')
    export_data()
    logging.info('Writing data to database complete')

    if timer.past_due:
        logging.info('The timer is past due!')
        

    logging.info('Python timer trigger function ran at %s', utc_timestamp)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM