Azure Functions 的 Azure 數據總管輸出系結 (預覽)
當函式執行時,Azure 數據總管輸出系結會將數據內嵌至 Azure 數據總管。
如需安裝和組態詳細數據的詳細資訊,請參閱概 觀。
範例
您可以使用下列其中一種 C# 模式來建立 C# 函式:
- 隔離的背景工作模型:在與運行時間隔離的背景工作進程中執行的已編譯 C# 函式。 需要隔離的背景工作進程,才能支援在 LTS 和非 LTS 版本 .NET 和 .NET Framework 上執行的 C# 函式。
- 同進程模型:在與 Functions 運行時間相同的進程中執行的已編譯 C# 函式。
- C# 文稿:主要用於在 Azure 入口網站 中建立 C# 函式。
重要
內含式模型支援將於 2026 年 11 月 10 日結束。 強烈建議您將應用程式移轉至隔離式背景工作角色模型,以取得完整支援。
GitHub 存放庫中提供 Azure 數據總管輸出系結的更多範例。
本區段包含下列範例:
這些範例會參考 Product
類別和對應的資料庫資料表:
public class Product
{
[JsonProperty(nameof(ProductID))]
public long ProductID { get; set; }
[JsonProperty(nameof(Name))]
public string Name { get; set; }
[JsonProperty(nameof(Cost))]
public double Cost { get; set; }
}
.create-merge table Products (ProductID:long, Name:string, Cost:double)
HTTP 觸發程式,寫入一筆記錄
下列範例顯示 將記錄新增至資料庫的 C# 函式 。 函式會使用 HTTP POST 要求中提供的數據做為 JSON 主體。
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Extensions.Kusto;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Azure.WebJobs.Extensions.Kusto.SamplesOutOfProc.OutputBindingSamples.Common;
namespace Microsoft.Azure.WebJobs.Extensions.Kusto.SamplesOutOfProc.OutputBindingSamples
{
public static class AddProduct
{
[Function("AddProduct")]
[KustoOutput(Database: "productsdb", Connection = "KustoConnectionString", TableName = "Products")]
public static async Task<Product> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "addproductuni")]
HttpRequestData req)
{
Product? prod = await req.ReadFromJsonAsync<Product>();
return prod ?? new Product { };
}
}
}
HTTP 觸發程式,使用對應寫入記錄
下列範例示範 將記錄集合加入至資料庫的 C# 函式 。 函式會使用將轉換成 的Product
Item
對應。
若要將資料從 Product
Item
轉換成 ,函式會使用對應參考:
.create-merge table Item (ItemID:long, ItemName:string, ItemCost:float)
-- Create a mapping that transforms an Item to a Product
.create-or-alter table Product ingestion json mapping "item_to_product_json" '[{"column":"ProductID","path":"$.ItemID"},{"column":"Name","path":"$.ItemName"},{"column":"Cost","path":"$.ItemCost"}]'
namespace Microsoft.Azure.WebJobs.Extensions.Kusto.SamplesOutOfProc.OutputBindingSamples.Common
{
public class Item
{
public long ItemID { get; set; }
public string? ItemName { get; set; }
public double ItemCost { get; set; }
}
}
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Extensions.Kusto;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Azure.WebJobs.Extensions.Kusto.SamplesOutOfProc.OutputBindingSamples.Common;
namespace Microsoft.Azure.WebJobs.Extensions.Kusto.SamplesOutOfProc.OutputBindingSamples
{
public static class AddProductsWithMapping
{
[Function("AddProductsWithMapping")]
[KustoOutput(Database: "productsdb", Connection = "KustoConnectionString", TableName = "Products", MappingRef = "item_to_product_json")]
public static async Task<Item> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "addproductswithmapping")]
HttpRequestData req)
{
Item? item = await req.ReadFromJsonAsync<Item>();
return item ?? new Item { };
}
}
}
GitHub 存放庫中提供 Java Azure 數據總管輸入系結的更多範例。
本區段包含下列範例:
這些範例會參考類別 Products
(在不同的檔案 Product.java
中)和對應的資料庫數據表 Products
(稍早定義):
package com.microsoft.azure.kusto.common;
import com.fasterxml.jackson.annotation.JsonProperty;
public class Product {
@JsonProperty("ProductID")
public long ProductID;
@JsonProperty("Name")
public String Name;
@JsonProperty("Cost")
public double Cost;
public Product() {
}
public Product(long ProductID, String name, double Cost) {
this.ProductID = ProductID;
this.Name = name;
this.Cost = Cost;
}
}
HTTP 觸發程式,將記錄寫入數據表
下列範例顯示 Java 函式中的 Azure 數據總管輸出系結,可將產品記錄新增至數據表。 函式會使用 HTTP POST 要求中提供的數據做為 JSON 主體。 函式會採用 com.fasterxml.jackson.core 連結庫的另一個相依性來剖析 JSON 主體。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.4.1</version>
</dependency>
package com.microsoft.azure.kusto.outputbindings;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.microsoft.azure.functions.HttpMethod;
import com.microsoft.azure.functions.HttpRequestMessage;
import com.microsoft.azure.functions.HttpResponseMessage;
import com.microsoft.azure.functions.HttpStatus;
import com.microsoft.azure.functions.OutputBinding;
import com.microsoft.azure.functions.annotation.AuthorizationLevel;
import com.microsoft.azure.functions.annotation.FunctionName;
import com.microsoft.azure.functions.annotation.HttpTrigger;
import com.microsoft.azure.functions.kusto.annotation.KustoOutput;
import com.microsoft.azure.kusto.common.Product;
import java.io.IOException;
import java.util.Optional;
import static com.microsoft.azure.kusto.common.Constants.*;
public class AddProduct {
@FunctionName("AddProduct")
public HttpResponseMessage run(@HttpTrigger(name = "req", methods = {
HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS, route = "addproductuni") HttpRequestMessage<Optional<String>> request,
@KustoOutput(name = "product", database = "productsdb", tableName = "Products", connection = KUSTOCONNSTR) OutputBinding<Product> product)
throws IOException {
if (request.getBody().isPresent()) {
String json = request.getBody().get();
ObjectMapper mapper = new ObjectMapper();
Product p = mapper.readValue(json, Product.class);
product.setValue(p);
return request.createResponseBuilder(HttpStatus.OK).header("Content-Type", "application/json").body(product)
.build();
} else {
return request.createResponseBuilder(HttpStatus.NO_CONTENT).header("Content-Type", "application/json")
.build();
}
}
}
HTTP 觸發程序,寫入至兩個資料表
下列範例顯示 Java 函式中的 Azure 數據總管輸出系結,可將記錄新增至兩個不同數據表中的資料庫 (Product
和 ProductChangeLog
)。 函式會使用 HTTP POST 要求中提供的數據做為 JSON 主體和多個輸出系結。 函式會採用 com.fasterxml.jackson.core 連結庫的另一個相依性來剖析 JSON 主體。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.4.1</version>
</dependency>
第二個資料表 ProductsChangeLog
,對應至下列定義:
.create-merge table ProductsChangeLog (ProductID:long, CreatedAt:datetime)
ProductsChangeLog.java
與 Java 類別:
package com.microsoft.azure.kusto.common;
import com.fasterxml.jackson.annotation.JsonProperty;
public class ProductsChangeLog {
@JsonProperty("ProductID")
public long ProductID;
@JsonProperty("CreatedAt")
public String CreatedAt;
public ProductsChangeLog() {
}
public ProductsChangeLog(long ProductID, String CreatedAt) {
this.ProductID = ProductID;
this.CreatedAt = CreatedAt;
}
}
package com.microsoft.azure.kusto.outputbindings;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.microsoft.azure.functions.HttpMethod;
import com.microsoft.azure.functions.HttpRequestMessage;
import com.microsoft.azure.functions.HttpResponseMessage;
import com.microsoft.azure.functions.HttpStatus;
import com.microsoft.azure.functions.OutputBinding;
import com.microsoft.azure.functions.annotation.AuthorizationLevel;
import com.microsoft.azure.functions.annotation.FunctionName;
import com.microsoft.azure.functions.annotation.HttpTrigger;
import com.microsoft.azure.functions.kusto.annotation.KustoOutput;
import com.microsoft.azure.kusto.common.Product;
import com.microsoft.azure.kusto.common.ProductsChangeLog;
import static com.microsoft.azure.kusto.common.Constants.*;
import java.io.IOException;
import java.time.Clock;
import java.time.Instant;
import java.util.Optional;
public class AddMultiTable {
@FunctionName("AddMultiTable")
public HttpResponseMessage run(@HttpTrigger(name = "req", methods = {
HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS, route = "addmultitable") HttpRequestMessage<Optional<String>> request,
@KustoOutput(name = "product", database = "productsdb", tableName = "Products", connection = KUSTOCONNSTR) OutputBinding<Product> product,
@KustoOutput(name = "productChangeLog", database = "productsdb", tableName = "ProductsChangeLog",
connection = KUSTOCONNSTR) OutputBinding<ProductsChangeLog> productChangeLog)
throws IOException {
if (request.getBody().isPresent()) {
String json = request.getBody().get();
ObjectMapper mapper = new ObjectMapper();
Product p = mapper.readValue(json, Product.class);
product.setValue(p);
productChangeLog.setValue(new ProductsChangeLog(p.ProductID, Instant.now(Clock.systemUTC()).toString()));
return request.createResponseBuilder(HttpStatus.OK).header("Content-Type", "application/json").body(product)
.build();
} else {
return request.createResponseBuilder(HttpStatus.NO_CONTENT).header("Content-Type", "application/json")
.build();
}
}
}
GitHub 存放庫中提供 Azure 數據總管輸出系結的更多範例。
本區段包含下列範例:
這些範例會參考資料庫數據表。
這些範例會參考數據表 Products
和 ProductsChangeLog
(稍早定義)。
HTTP 觸發程序,將記錄寫入至資料表
下列範例示範function.json檔案中的 Azure 數據總管輸出系結,以及將記錄新增至數據表的 JavaScript 函式。 函式會使用 HTTP POST 要求中提供的數據做為 JSON 主體。
下列範例是系結function.json檔案中的數據:
{
"bindings": [
{
"authLevel": "function",
"name": "req",
"direction": "in",
"type": "httpTrigger",
"methods": [
"post"
],
"route": "addproduct"
},
{
"name": "$return",
"type": "http",
"direction": "out"
},
{
"name": "product",
"type": "kusto",
"database": "productsdb",
"direction": "out",
"tableName": "Products",
"connection": "KustoConnectionString"
}
],
"disabled": false
}
組 態 區段說明這些屬性。
下列代碼段是範例 JavaScript 程式代碼:
// Insert the product, which will insert it into the Products table.
module.exports = async function (context, req) {
// Note that this expects the body to be a JSON object or array of objects which have a property
// matching each of the columns in the table to insert to.
context.bindings.product = req.body;
return {
status: 201,
body: req.body
};
}
HTTP 觸發程序,寫入至兩個資料表
下列範例顯示function.json檔案中的 Azure 數據總管輸出系結,以及 JavaScript 函式,可將記錄新增至兩個不同數據表中的資料庫 (Products
和 ProductsChangeLog
)。 函式會使用 HTTP POST 要求中提供的數據做為 JSON 主體和多個輸出系結。
第二個資料表 ProductsChangeLog
,對應至下列定義:
.create-merge table ProductsChangeLog (ProductID:long, CreatedAt:datetime)
下列代碼段是系結function.json檔案中的數據:
{
"bindings": [
{
"authLevel": "function",
"name": "req",
"direction": "in",
"type": "httpTrigger",
"methods": [
"post"
],
"route": "addmultitable"
},
{
"name": "res",
"type": "http",
"direction": "out"
},
{
"name": "product",
"type": "kusto",
"database": "productsdb",
"direction": "out",
"tableName": "Products",
"connection": "KustoConnectionString"
},
{
"name": "productchangelog",
"type": "kusto",
"database": "productsdb",
"direction": "out",
"tableName": "ProductsChangeLog",
"connection": "KustoConnectionString"
}
],
"disabled": false
}
組 態 區段說明這些屬性。
下列代碼段是範例 JavaScript 程式代碼:
module.exports = async function (context, req) {
context.log('JavaScript HTTP trigger and Kusto output binding function processed a request.');
context.log(req.body);
if (req.body) {
var changeLog = {ProductID:req.body.ProductID, CreatedAt: new Date().toISOString()};
context.bindings.product = req.body;
context.bindings.productchangelog = changeLog;
context.res = {
body: req.body,
mimetype: "application/json",
status: 201
}
} else {
context.res = {
status: 400,
body: "Error reading request body"
}
}
}
GitHub 存放庫中提供 Azure 數據總管輸出系結的更多範例。
本區段包含下列範例:
這些範例會參考數據表 Products
和 ProductsChangeLog
(稍早定義)。
HTTP 觸發程序,將記錄寫入至資料表
下列範例示範function.json檔案中的 Azure 數據總管輸出系結,以及將記錄新增至數據表的 Python 函式。 函式會使用 HTTP POST 要求中提供的數據做為 JSON 主體。
下列代碼段是系結function.json檔案中的數據:
{
"scriptFile": "__init__.py",
"bindings": [
{
"authLevel": "Anonymous",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"methods": [
"post"
],
"route": "addproductuni"
},
{
"type": "http",
"direction": "out",
"name": "$return"
},
{
"name": "product",
"type": "kusto",
"database": "sdktestsdb",
"direction": "out",
"tableName": "Products",
"connection": "KustoConnectionString"
}
]
}
組 態 區段說明這些屬性。
下列代碼段是 Python 程式代碼範例:
import azure.functions as func
from Common.product import Product
def main(req: func.HttpRequest, product: func.Out[str]) -> func.HttpResponse:
body = str(req.get_body(),'UTF-8')
product.set(body)
return func.HttpResponse(
body=body,
status_code=201,
mimetype="application/json"
)
HTTP 觸發程序,寫入至兩個資料表
下列範例顯示function.json檔案中的 Azure 數據總管輸出系結,以及 JavaScript 函式,可將記錄新增至兩個不同數據表中的資料庫 (Products
和 ProductsChangeLog
)。 函式會使用 HTTP POST 要求中提供的數據做為 JSON 主體和多個輸出系結。 第二個資料表 ProductsChangeLog
,對應至下列定義:
.create-merge table ProductsChangeLog (ProductID:long, CreatedAt:datetime)
下列代碼段是系結function.json檔案中的數據:
{
"scriptFile": "__init__.py",
"bindings": [
{
"authLevel": "Anonymous",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"methods": [
"post"
],
"route": "addmultitable"
},
{
"type": "http",
"direction": "out",
"name": "$return"
},
{
"name": "product",
"type": "kusto",
"database": "sdktestsdb",
"direction": "out",
"tableName": "Products",
"connection": "KustoConnectionString"
},
{
"name": "productchangelog",
"type": "kusto",
"database": "sdktestsdb",
"direction": "out",
"tableName": "ProductsChangeLog",
"connection": "KustoConnectionString"
}
]
}
組 態 區段說明這些屬性。
下列代碼段是 Python 程式代碼範例:
import json
from datetime import datetime
import azure.functions as func
from Common.product import Product
def main(req: func.HttpRequest, product: func.Out[str],productchangelog: func.Out[str]) -> func.HttpResponse:
body = str(req.get_body(),'UTF-8')
# parse x:
product.set(body)
id = json.loads(body)["ProductID"]
changelog = {
"ProductID": id,
"CreatedAt": datetime.now().isoformat(),
}
productchangelog.set(json.dumps(changelog))
return func.HttpResponse(
body=body,
status_code=201,
mimetype="application/json"
)
屬性
C# 連結 庫 會使用 KustoAttribute 屬性來宣告函式上的 Azure 數據總管系結,其具有下列屬性。
屬性內容 | 描述 |
---|---|
資料庫 | 必要。 必須對其執行查詢的資料庫。 |
連線 | 必要。 保留 連接字串的變數名稱,該變數會透過環境變數或函式應用程式設定解析。 預設會查閱變數 KustoConnectionString 。 在運行時間,此變數會針對環境進行查閱。 連接字串 的文件位於 Kusto 連接字串。 例如: "KustoConnectionString": "Data Source=https://your_cluster.kusto.windows.net;Database=your_Database;Fed=True;AppClientId=your_AppId;AppKey=your_AppKey;Authority Id=your_TenantId 。 |
TableName | 必要。 要內嵌數據的數據表。 |
MappingRef | 選擇性。 傳遞已在叢集中定義的對應 ref 屬性。 |
ManagedServiceIdentity | 選擇性。 受控識別可用來連線到 Azure 數據總管。 若要使用系統受控識別,請使用「系統」。任何其他身分識別名稱會解譯為使用者受控識別。 |
DataFormat | 選擇性。 預設資料格式為 multijson/json 。 它可以設定為格式列舉中datasource 支援的文字格式。 範例會針對 CSV 和 JSON 格式進行驗證並提供。 |
註釋
Java 函式運行時間連結庫會使用@KustoInput
註釋 (com.microsoft.azure.functions.kusto.annotation.KustoOutput
)。
元素 | 描述 |
---|---|
NAME | 必要。 代表函式程式代碼中查詢結果的變數名稱。 |
database | 必要。 必須對其執行查詢的資料庫。 |
connection | 必要。 保存 連接字串的變數名稱,該變數會透過環境變數或函式應用程式設定解析。 預設會查閱變數 KustoConnectionString 。 在運行時間,此變數會針對環境進行查閱。 連接字串 的文件位於 Kusto 連接字串。 例如: "KustoConnectionString": "Data Source=https://your_cluster.kusto.windows.net;Database=your_Database;Fed=True;AppClientId=your_AppId;AppKey=your_AppKey;Authority Id=your_TenantId 。 |
tableName | 必要。 要內嵌數據的數據表。 |
mappingRef | 選擇性。 傳遞已在叢集中定義的對應 ref 屬性。 |
dataFormat | 選擇性。 預設資料格式為 multijson/json 。 它可以設定為格式列舉中datasource 支援的文字格式。 範例會針對 CSV 和 JSON 格式進行驗證並提供。 |
managedServiceIdentity | 受控識別可用來連線到 Azure 數據總管。 若要使用系統受控識別,請使用「系統」。任何其他身分識別名稱會解譯為使用者受控識別。 |
組態
下表說明您在 function.json 檔案中設定的繫結設定屬性。
function.json 屬性 | 描述 |
---|---|
type | 必要。 必須設定為 kusto 。 |
direction | 必要。 必須設定為 out 。 |
NAME | 必要。 代表函式程式代碼中查詢結果的變數名稱。 |
database | 必要。 必須對其執行查詢的資料庫。 |
connection | 必要。 保存 連接字串、透過環境變數或函式應用程式設定解析的變數名稱。 預設會查閱變數 KustoConnectionString 。 在運行時間,此變數會針對環境進行查閱。 連接字串 的文件位於 Kusto 連接字串。 例如: "KustoConnectionString": "Data Source=https://your_cluster.kusto.windows.net;Database=your_Database;Fed=True;AppClientId=your_AppId;AppKey=your_AppKey;Authority Id=your_TenantId 。 |
tableName | 必要。 要內嵌數據的數據表。 |
mappingRef | 選擇性。 傳遞已在叢集中定義的對應 ref 屬性。 |
dataFormat | 選擇性。 預設資料格式為 multijson/json 。 它可以設定為格式列舉中datasource 支援的文字格式。 範例會針對 CSV 和 JSON 格式進行驗證並提供。 |
managedServiceIdentity | 受控識別可用來連線到 Azure 數據總管。 若要使用系統受控識別,請使用「系統」。任何其他身分識別名稱會解譯為使用者受控識別。 |
當您在本機開發時,請在集合中的 local.settings.json 檔案Values
中新增應用程式設定。
使用方式
屬性的建構函式會採用資料庫和屬性 TableName
、 MappingRef
和以及 DataFormat
連接設定名稱。 KQL 命令可以是 KQL 語句或 KQL 函式。 連接字串 設定名稱會對應至包含 Kusto 連接字串 的應用程式設定(用於local.settings.json
本機開發)。 例如:"KustoConnectionString": "Data Source=https://your_cluster.kusto.windows.net;Database=your_Database;Fed=True;AppClientId=your_AppId;AppKey=your_AppKey;Authority Id=your_TenantId
。 輸入系結所執行的查詢會參數化。 KQL 參數中提供的值會在運行時間使用。