分享方式:


使用 Visual Studio Code 將 Azure Functions 連線至 Azure SQL Database

Azure Functions 可讓您直接將 Azure 服務和其他資源連線至函式,而不需要自行撰寫整合程式碼。 這些繫結同時代表輸入和輸出,會宣告於函式定義內。 繫結中的資料會提供給函式作為參數。 「觸發程序」是一種特殊的輸入繫結。 雖然函式只有一個觸發程序,但可以有多個輸入和輸出繫結。 若要深入了解,請參閱 Azure Functions 觸發程序和繫結概念

本文說明如何使用 Visual Studio Code 將 Azure SQL Database 連線至您在先前的快速入門文章中建立的函式。 您新增至此函式的輸出繫結,會將資料從 HTTP 要求寫入至 Azure SQL Database 中的資料表。

開始之前,您必須完成快速入門:使用 Visual Studio Code 在 Azure 中建立 C# 函式。 如果您已在該文章結束時清除資源,請重新執行這些步驟以在 Azure 中重新建立函式應用程式和相關資源。

開始之前,您必須完成快速入門:使用 Visual Studio Code 在 Azure 中建立 JavaScript 函式。 如果您已在該文章結束時清除資源,請重新執行這些步驟以在 Azure 中重新建立函式應用程式和相關資源。

開始之前,您必須完成快速入門:使用 Visual Studio Code 在 Azure 中建立 Python 函式。 如果您已在該文章結束時清除資源,請重新執行這些步驟以在 Azure 中重新建立函式應用程式和相關資源。

如需設定的詳細資訊,請參閱 Azure Functions 文件提供的 Azure Functions 的 Azure SQL 繫結和觸發

建立您的 Azure SQL Database

  1. 請遵循 Azure SQL Database 建立快速入門,建立無伺服器 Azure SQL Database。 資料庫可以是空的,也可以從範例資料集 AdventureWorksLT 建立。

  2. 提示中會提供下列資訊:

    提示 選取項目
    資源群組 選擇您在先前的文章中建立函式應用程式所在的資源群組。
    資料庫名稱 輸入 mySampleDatabase
    伺服器名稱 輸入伺服器的唯一名稱。 由於伺服器名稱必須是 Azure 中所有伺服器的全域唯一名稱,而不只是訂用帳戶中的唯一名稱,因此我們無法提供要使用的確切伺服器名稱。
    驗證方法 選取 [SQL Server 驗證]
    伺服器管理員登入 輸入 azureuser
    密碼 輸入符合複雜性需求的密碼。
    允許 Azure 服務和資源存取此伺服器 選取 [是]
  3. 建立完成後,瀏覽至 Azure 入口網站中的資料庫刀鋒視窗,然後在 [設定] 底下選取 [連接字串]。 複製 SQL 驗證ADO.NET 連接字串。 將連接字串貼到暫存文件中,以供稍後使用。

    在 Azure 入口網站 中複製 Azure SQL 資料庫 連接字串 的螢幕快照。

  4. 建立資料表,儲存來自 HTTP 要求的資料。 在 Azure 入口網站中,瀏覽至資料庫刀鋒視窗,然後選取 [查詢編輯器]。 輸入下列查詢,建立名為 dbo.ToDo 的資料表:

    CREATE TABLE dbo.ToDo (
        [Id] UNIQUEIDENTIFIER PRIMARY KEY,
        [order] INT NULL,
        [title] NVARCHAR(200) NOT NULL,
        [url] NVARCHAR(200) NOT NULL,
        [completed] BIT NOT NULL
    );
    
  5. 檢查伺服器的防火牆設定,確認您的 Azure 函式能夠存取 Azure SQL Database。 瀏覽至 Azure 入口網站的伺服器刀鋒視窗,在 [安全性] 底下,選取 [網路]。 [允許 Azure 服務和資源存取此伺服器] 的例外狀況應該是已核取狀態。

    在 Azure 入口網站 中檢查 Azure SQL 資料庫 防火牆設定的螢幕快照。

更新函式應用程式的設定

先前的快速入門文章中,您已在 Azure 中建立函式應用程式。 在本文中,您會更新您的應用程式,將資料寫入至您剛才建立的 Azure SQL Database。 若要連線至您的 Azure SQL Database,您必須將其連接字串新增至您的應用程式設定。 接著,您將新設定下載到 local.settings.json 檔案,以便在本機執行時連線至您的 Azure SQL Database。

  1. 編輯您稍早在暫存文件中建立的連接字串。 將 Password 的值取代為您在建立 Azure SQL Database 時使用的密碼。 複製更新的連接字串。

  2. 按下 Ctrl/Cmd+shift+P 開啟命令選擇區,然後搜尋並執行命令 Azure Functions: Add New Setting...

  3. 選擇您在先前的文章中所建立的函式應用程式。 提示中會提供下列資訊:

    提示 選取項目
    輸入新的應用程式設定名稱 輸入 SqlConnectionString
    輸入 "SqlConnectionString" 的值 貼上您剛才複製的 Azure SQL Database 連接字串。

    這會在 Azure 中的函式應用程式中建立名為 connection SqlConnectionString 的應用程式設定。 現在,您可以將此設定下載到您的 local.settings.json 檔案。

  4. 再次按下 Ctrl/Cmd+shift+P 開啟命令選擇區,然後搜尋並執行命令 Azure Functions: Download Remote Settings...

  5. 選擇您在先前的文章中所建立的函式應用程式。 選取 [全部皆是] 來覆寫現有的本機設定。

這會將所有設定從 Azure 下載到您的本機專案,包括新的連接字串設定。 下載的設定大部分在本機執行時不會使用。

註冊繫結延伸模組

由於您使用 Azure SQL 輸出繫結,在執行專案之前,必須先安裝對應的繫結延伸模組。

除了 HTTP 和計時器觸發程序之外,繫結皆會以擴充套件的形式實作。 在終端機視窗中執行下列 dotnet add package 命令,將 Azure SQL 延伸模組套件新增至您的專案。

dotnet add package Microsoft.Azure.Functions.Worker.Extensions.Sql

您的專案已設定為使用擴充功能配套,這會自動安裝一組預先定義的擴充功能套件。

系統會在專案根目錄的 host. json 檔案中啟用擴充功能套件組合,如下所示:

{
  "version": "2.0",
  "logging": {
    "applicationInsights": {
      "samplingSettings": {
        "isEnabled": true,
        "excludedTypes": "Request"
      }
    }
  },
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[4.*, 5.0.0)"
  },
  "concurrency": {
    "dynamicConcurrencyEnabled": true,
    "snapshotPersistenceEnabled": true
  }
}

:::

現在,您可以將 Azure SQL 輸出繫結新增至您的專案。

新增輸出繫結

在函式中,每一種繫結都需要在 function.json 檔案中定義 directiontype 和唯一的 name。 定義這些屬性的方式會取決於您函式應用程式的語言。

開啟 HttpExample.cs 專案檔並新增下列 ToDoItem 類別,此類別定義寫入至資料庫的物件:

namespace AzureSQL.ToDo
{
    public class ToDoItem
    {
        public Guid Id { get; set; }
        public int? order { get; set; }
        public string title { get; set; }
        public string url { get; set; }
        public bool? completed { get; set; }
    }
}

在 C# 類別庫專案中,繫結會被定義為函式方法上的繫結屬性。 接著,系統會根據這些屬性自動產生函式所需的 function.json 檔案。

開啟 HttpExample.cs 專案檔並新增下列輸出型別類別,此類別定義從使用 HTTP 回應和 SQL 輸出的函式所輸出的合併物件:

public static class OutputType
{
    [SqlOutput("dbo.ToDo", connectionStringSetting: "SqlConnectionString")]
    public ToDoItem ToDoItem { get; set; }
    public HttpResponseData HttpResponse { get; set; }
}

Microsoft.Azure.Functions.Worker.Extensions.Sql 程式庫的 using 陳述式新增至檔案頂端:

using Microsoft.Azure.Functions.Worker.Extensions.Sql;

系結屬性會直接在您的程式代碼中定義。 Azure SQL 輸出組態說明 Azure SQL 輸出繫結所需的欄位。

在此 MultiResponse 案例中,您必須將輸出系結新增 extraOutputs 至 函式。

app.http('HttpExample', {
  methods: ['GET', 'POST'],
  extraOutputs: [sendToSql],
  handler: async (request, context) => {

將下列屬性新增至系結組態:

const sendToSql = output.sql({
  commandText: 'dbo.ToDo',
  connectionStringSetting: 'SqlConnectionString',
});

繫結屬性是直接定義在 function_app.py 檔案中。 您使用 generic_output_binding 裝飾項目新增 Azure SQL 輸出繫結

@app.generic_output_binding(arg_name="toDoItems", type="sql", CommandText="dbo.ToDo", ConnectionStringSetting="SqlConnectionString"
    data_type=DataType.STRING)

在此程式碼中,arg_name 識別程式碼中參考的繫結參數,type 表示輸出繫結是 SQL 輸出繫結,CommandText 是繫結寫入的資料表,而 ConnectionStringSetting 是包含 Azure SQL 連接字串的應用程式設定名稱。 連接字串位於 local.settings.json 檔案中的 SqlConnectionString 設定中。

新增會使用輸出繫結的程式碼

以下列程式碼取代現有的 Run 方法:

[Function("HttpExample")]
public static OutputType Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req,
    FunctionContext executionContext)
{
    var logger = executionContext.GetLogger("HttpExample");
    logger.LogInformation("C# HTTP trigger function processed a request.");

    var message = "Welcome to Azure Functions!";

    var response = req.CreateResponse(HttpStatusCode.OK);
    response.Headers.Add("Content-Type", "text/plain; charset=utf-8");
    response.WriteString(message);

    // Return a response to both HTTP trigger and Azure SQL output binding.
    return new OutputType()
    {
         ToDoItem = new ToDoItem
        {
            id = System.Guid.NewGuid().ToString(),
            title = message,
            completed = false,
            url = ""
        },
        HttpResponse = response
    };
}

新增使用 extraInputscontext輸出系結物件將 JSON 檔案傳送至具名輸出系結函式的程式碼。 sendToSqlreturn 陳述式前面新增此程式碼。

const data = JSON.stringify([
  {
    // create a random ID
    Id: crypto.randomUUID(),
    title: name,
    completed: false,
    url: '',
  },
]);

// Output to Database
context.extraOutputs.set(sendToSql, data);

若要利用 crypto 模組,請將下列這行新增至檔案頂端:

const crypto = require("crypto");

此時,您的函式看起來應如下所示:

const { app, output } = require('@azure/functions');
const crypto = require('crypto');

const sendToSql = output.sql({
  commandText: 'dbo.ToDo',
  connectionStringSetting: 'SqlConnectionString',
});

app.http('HttpExample', {
  methods: ['GET', 'POST'],
  extraOutputs: [sendToSql],
  handler: async (request, context) => {
    try {
      context.log(`Http function processed request for url "${request.url}"`);

      const name = request.query.get('name') || (await request.text());

      if (!name) {
        return { status: 404, body: 'Missing required data' };
      }

      // Stringified array of objects to be inserted into the database
      const data = JSON.stringify([
        {
          // create a random ID
          Id: crypto.randomUUID(),
          title: name,
          completed: false,
          url: '',
        },
      ]);

      // Output to Database
      context.extraOutputs.set(sendToSql, data);

      const responseMessage = name
        ? 'Hello, ' +
          name +
          '. This HTTP triggered function executed successfully.'
        : 'This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response.';

      // Return to HTTP client
      return { body: responseMessage };
    } catch (error) {
      context.log(`Error: ${error}`);
      return { status: 500, body: 'Internal Server Error' };
    }
  },
});

更新 HttpExample\function_app.py 以符合下列程式碼。 將 toDoItems 參數新增至函式定義和 if name: 陳述式底下的 toDoItems.set()

import azure.functions as func
import logging
from azure.functions.decorators.core import DataType
import uuid

app = func.FunctionApp()

@app.function_name(name="HttpTrigger1")
@app.route(route="hello", auth_level=func.AuthLevel.ANONYMOUS)
@app.generic_output_binding(arg_name="toDoItems", type="sql", CommandText="dbo.ToDo", ConnectionStringSetting="SqlConnectionString",data_type=DataType.STRING)
def test_function(req: func.HttpRequest, toDoItems: func.Out[func.SqlRow]) -> func.HttpResponse:
     logging.info('Python HTTP trigger function processed a request.')
     name = req.get_json().get('name')
     if not name:
        try:
            req_body = req.get_json()
        except ValueError:
            pass
        else:
            name = req_body.get('name')

     if name:
        toDoItems.set(func.SqlRow({"Id": str(uuid.uuid4()), "title": name, "completed": False, "url": ""}))
        return func.HttpResponse(f"Hello {name}!")
     else:
        return func.HttpResponse(
                    "Please pass a name on the query string or in the request body",
                    status_code=400
                )

在本機執行函式

Visual Studio Code 可與 Azure Functions Core 工具整合,讓您能夠先在本機開發電腦上執行此專案,再發佈至 Azure。 如果您尚未在本機安裝 Core Tools,系統會在您第一次執行專案時提示您安裝。

  1. 若要呼叫您的函式,請按 F5 以啟動函式應用程式專案。 [終端] 面板會顯示核心工具的輸出。 您的應用程式會在 [終端] 面板中啟動。 您可以查看在本機所執行 HTTP 觸發函式的 URL 端點。

    本機函式 Visual Studio Code 輸出的螢幕快照。

    如果您尚未安裝 Core Tools,請在系統提示安裝時選取 [安裝] 來安裝 Core Tools。
    如果在 Windows 上執行時遇到問題,請確定 Visual Studio Code 的預設終端機未設定為 WSL Bash

  2. 執行 Core Tools 時,移至 [Azure: Functions] 區域。 在 [函式] 下方,展開 [本機專案]>[函式]。 以滑鼠右鍵按一下 (Windows) 或 Ctrl - 點擊 (macOS) HttpExample 函式,並選擇 [立即執行函式...]

    現在從 Visual Studio Code 執行函式的螢幕快照。

  3. 在 [輸入要求本文] 中,按下 Enter 向您的函式傳送要求訊息。

  4. 當函式在本機執行並傳回回應時,會在 Visual Studio Code 中引發通知。 [終端機] 面板會顯示函數執行的相關資訊於。

  5. Ctrl + C 以停止 Core Tools,並中斷偵錯工具的連線。

在本機執行函式

  1. 如先前的文章中所示,按一下 F5 可開啟函式應用程式專案和 Core Tools。

  2. 執行 Core Tools 後,移至 [Azure: Functions] 區域。 在 [函式] 下方,展開 [本機專案]>[函式]。 以滑鼠右鍵按一下 HttpExample 函式 (Mac 上為 Ctrl + 按一下),並選擇 [立即執行函式...]

    Visual Studio Code 現在執行函式功能表項的螢幕快照。

  3. 在 [輸入要求本文] 中,會看到 { "name": "Azure" } 的要求訊息本文值。 請按 Enter 鍵,將此要求訊息傳送至您的函式。

  4. 傳回回應後,按一下 Ctrl + C 以停止 Core Tools。

確認資訊已寫入至資料庫

  1. 在 Azure 入口網站,返回 Azure SQL Database,然後選取 [查詢編輯器]

    登入 Azure 入口網站 查詢編輯器的螢幕快照。

  2. 連線至您的資料庫,然後在左側的物件總管中展開 [資料表] 節點。 以滑鼠右鍵按一下 dbo.ToDo 資料表,然後選取 [選取前 1000 列]

  3. 確認新資訊已透過資料繫結寫入至資料庫。

重新部署並驗證更新的應用程式

  1. 在 Visual Studio Code 中,按 F1 開啟命令選擇區。 在命令選擇區中,搜尋並選取 Azure Functions: Deploy to function app...

  2. 選擇您在第一篇文章中所建立的函式應用程式。 由於您是要將專案部署至相同的應用程式,請選取 [部署] 來關閉關於覆寫檔案的警告。

  3. 部署完成之後,您可以再次使用 [立即執行函式...] 功能來觸發 Azure 中的函式。

  4. 再次檢查寫入至 Azure SQL Database 的資料,驗證輸出繫結再次產生新的 JSON 文件。

清除資源

在 Azure 中,「資源」是指函式應用程式、函式、儲存體帳戶等等。 其會分組為「資源群組」,您可以藉由刪除群組來刪除群組中的所有項目。

您已建立資源來完成這些快速入門。 您可能必須支付這些資源,取決於您的帳戶狀態服務定價。 如果您不再需要資源,刪除方式如下:

  1. 在 Visual Studio Code 中,按 F1 開啟命令選擇區。 在命令選擇區中,搜尋並選取 Azure: Open in portal

  2. 選擇您的函數應用程式,並按下 Enter。 函式應用程式頁面會在 Azure 入口網站中開啟。

  3. 在 [概觀] 索引標籤中,選取 [資源群組] 旁的具名連結。

    從函式應用程式頁面選取要刪除的資源群組螢幕快照。

  4. 在 [資源群組] 分頁上,檢閱所含資源的清單,並確認這些是您想要刪除的項目。

  5. 選取 [刪除資源群組],並遵循指示。

    刪除需要幾分鐘的時間。 完成時,通知會出現幾秒鐘的時間。 您也可以選取分頁頂端的鈴鐺圖示以檢視通知。

下一步

您已更新 HTTP 觸發的函式,以將資料寫入至 Azure SQL Database。 現在,您可以深入了解如何使用 Visual Studio Code 來開發 Functions: