使用 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
請遵循 Azure SQL Database 建立快速入門,建立無伺服器 Azure SQL Database。 資料庫可以是空的,也可以從範例資料集 AdventureWorksLT 建立。
提示中會提供下列資訊:
提示 選取項目 資源群組 選擇您在先前的文章中建立函式應用程式所在的資源群組。 資料庫名稱 輸入 mySampleDatabase
。伺服器名稱 輸入伺服器的唯一名稱。 由於伺服器名稱必須是 Azure 中所有伺服器的全域唯一名稱,而不只是訂用帳戶中的唯一名稱,因此我們無法提供要使用的確切伺服器名稱。 驗證方法 選取 [SQL Server 驗證] 。 伺服器管理員登入 輸入 azureuser
。密碼 輸入符合複雜性需求的密碼。 允許 Azure 服務和資源存取此伺服器 選取 [是]。 建立完成後,瀏覽至 Azure 入口網站中的資料庫刀鋒視窗,然後在 [設定] 底下選取 [連接字串]。 複製 SQL 驗證的 ADO.NET 連接字串。 將連接字串貼到暫存文件中,以供稍後使用。
建立資料表,儲存來自 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 );
檢查伺服器的防火牆設定,確認您的 Azure 函式能夠存取 Azure SQL Database。 瀏覽至 Azure 入口網站的伺服器刀鋒視窗,在 [安全性] 底下,選取 [網路]。 [允許 Azure 服務和資源存取此伺服器] 的例外狀況應該是已核取狀態。
更新函式應用程式的設定
在先前的快速入門文章中,您已在 Azure 中建立函式應用程式。 在本文中,您會更新您的應用程式,將資料寫入至您剛才建立的 Azure SQL Database。 若要連線至您的 Azure SQL Database,您必須將其連接字串新增至您的應用程式設定。 接著,您將新設定下載到 local.settings.json 檔案,以便在本機執行時連線至您的 Azure SQL Database。
編輯您稍早在暫存文件中建立的連接字串。 將
Password
的值取代為您在建立 Azure SQL Database 時使用的密碼。 複製更新的連接字串。按下 Ctrl/Cmd+shift+P 開啟命令選擇區,然後搜尋並執行命令
Azure Functions: Add New Setting...
。選擇您在先前的文章中所建立的函式應用程式。 提示中會提供下列資訊:
提示 選取項目 輸入新的應用程式設定名稱 輸入 SqlConnectionString
。輸入 "SqlConnectionString" 的值 貼上您剛才複製的 Azure SQL Database 連接字串。 這會在 Azure 中的函式應用程式中建立名為 connection
SqlConnectionString
的應用程式設定。 現在,您可以將此設定下載到您的 local.settings.json 檔案。再次按下 Ctrl/Cmd+shift+P 開啟命令選擇區,然後搜尋並執行命令
Azure Functions: Download Remote Settings...
。選擇您在先前的文章中所建立的函式應用程式。 選取 [全部皆是] 來覆寫現有的本機設定。
這會將所有設定從 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 檔案中定義 direction
、type
和唯一的 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
};
}
新增使用 extraInputs
的context
輸出系結物件將 JSON 檔案傳送至具名輸出系結函式的程式碼。 sendToSql
在 return
陳述式前面新增此程式碼。
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,系統會在您第一次執行專案時提示您安裝。
若要呼叫您的函式,請按 F5 以啟動函式應用程式專案。 [終端] 面板會顯示核心工具的輸出。 您的應用程式會在 [終端] 面板中啟動。 您可以查看在本機所執行 HTTP 觸發函式的 URL 端點。
如果您尚未安裝 Core Tools,請在系統提示安裝時選取 [安裝] 來安裝 Core Tools。
如果在 Windows 上執行時遇到問題,請確定 Visual Studio Code 的預設終端機未設定為 WSL Bash。執行 Core Tools 時,移至 [Azure: Functions] 區域。 在 [函式] 下方,展開 [本機專案]>[函式]。 以滑鼠右鍵按一下 (Windows) 或 Ctrl - 點擊 (macOS)
HttpExample
函式,並選擇 [立即執行函式...]。在 [輸入要求本文] 中,按下 Enter 向您的函式傳送要求訊息。
當函式在本機執行並傳回回應時,會在 Visual Studio Code 中引發通知。 [終端機] 面板會顯示函數執行的相關資訊於。
按 Ctrl + C 以停止 Core Tools,並中斷偵錯工具的連線。
在本機執行函式
如先前的文章中所示,按一下 F5 可開啟函式應用程式專案和 Core Tools。
執行 Core Tools 後,移至 [Azure: Functions] 區域。 在 [函式] 下方,展開 [本機專案]>[函式]。 以滑鼠右鍵按一下
HttpExample
函式 (Mac 上為 Ctrl + 按一下),並選擇 [立即執行函式...]。在 [輸入要求本文] 中,會看到
{ "name": "Azure" }
的要求訊息本文值。 請按 Enter 鍵,將此要求訊息傳送至您的函式。傳回回應後,按一下 Ctrl + C 以停止 Core Tools。
確認資訊已寫入至資料庫
在 Azure 入口網站,返回 Azure SQL Database,然後選取 [查詢編輯器]。
連線至您的資料庫,然後在左側的物件總管中展開 [資料表] 節點。 以滑鼠右鍵按一下
dbo.ToDo
資料表,然後選取 [選取前 1000 列]。確認新資訊已透過資料繫結寫入至資料庫。
重新部署並驗證更新的應用程式
在 Visual Studio Code 中,按 F1 開啟命令選擇區。 在命令選擇區中,搜尋並選取
Azure Functions: Deploy to function app...
。選擇您在第一篇文章中所建立的函式應用程式。 由於您是要將專案部署至相同的應用程式,請選取 [部署] 來關閉關於覆寫檔案的警告。
部署完成之後,您可以再次使用 [立即執行函式...] 功能來觸發 Azure 中的函式。
再次檢查寫入至 Azure SQL Database 的資料,驗證輸出繫結再次產生新的 JSON 文件。
清除資源
在 Azure 中,「資源」是指函式應用程式、函式、儲存體帳戶等等。 其會分組為「資源群組」,您可以藉由刪除群組來刪除群組中的所有項目。
您已建立資源來完成這些快速入門。 您可能必須支付這些資源,取決於您的帳戶狀態和服務定價。 如果您不再需要資源,刪除方式如下:
在 Visual Studio Code 中,按 F1 開啟命令選擇區。 在命令選擇區中,搜尋並選取
Azure: Open in portal
。選擇您的函數應用程式,並按下 Enter。 函式應用程式頁面會在 Azure 入口網站中開啟。
在 [概觀] 索引標籤中,選取 [資源群組] 旁的具名連結。
在 [資源群組] 分頁上,檢閱所含資源的清單,並確認這些是您想要刪除的項目。
選取 [刪除資源群組],並遵循指示。
刪除需要幾分鐘的時間。 完成時,通知會出現幾秒鐘的時間。 您也可以選取分頁頂端的鈴鐺圖示以檢視通知。
下一步
您已更新 HTTP 觸發的函式,以將資料寫入至 Azure SQL Database。 現在,您可以深入了解如何使用 Visual Studio Code 來開發 Functions: