你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
适用于 Azure Functions 的 Azure 数据资源管理器输出绑定(预览版)
函数运行时,Azure 数据资源管理器输出绑定会将数据引入 Azure 数据资源管理器。
若要了解设置和配置详细信息,请参阅概述。
示例
可使用以下 C# 模式之一来创建 C# 函数:
- 独立辅助角色模型:编译的 C# 函数,该函数在独立于运行时的工作进程中运行。 需要独立工作进程才能支持在 LTS 和非 LTS 版 .NET 和 .NET Framework 上运行的 C# 函数。
- 进程内模型:编译的 C# 函数,该函数在与 Functions 运行时相同的进程中运行。
- 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 文件和 JavaScript 函数中的 Azure 数据资源管理器输出绑定,将记录添加到表中。 该函数使用 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 文件和 Python 函数中的 Azure 数据资源管理器输出绑定,将记录添加到表中。 该函数使用 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 数据资源管理器绑定,该函数具有以下属性。
Attribute 属性 | 说明 |
---|---|
数据库 | 必需。 必须对其执行查询的数据库。 |
连接 | 必需。 保存连接字符串的变量的名称,它通过环境变量或函数应用设置进行解析。 默认为查找变量 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 | 可选。 用于传递已在群集中定义的映射引用的属性。 |
ManagedServiceIdentity | 可选。 托管标识可用于连接到 Azure 数据资源管理器。 若要使用系统托管标识,请使用“系统”,任何其他标识名称都解释为用户托管标识。 |
DataFormat | 可选。 默认数据格式为 multijson/json 。 它可以设置为 datasource 格式枚举中支持的文本格式。 示例已经过验证,并提供了 CSV 和 JSON 格式。 |
批注
Java 函数运行时库使用 @KustoInput
注释 (com.microsoft.azure.functions.kusto.annotation.KustoOutput
)。
元素 | 说明 |
---|---|
name | 必需。 表示函数代码中的查询结果的变量的名称。 |
database | 必需。 必须对其执行查询的数据库。 |
连接 | 必需。 保存连接字符串的变量的名称,它通过环境变量或函数应用设置进行解析。 默认为查找变量 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 | 可选。 用于传递已在群集中定义的映射引用的属性。 |
dataFormat | 可选。 默认数据格式为 multijson/json 。 它可以设置为 datasource 格式枚举中支持的文本格式。 示例已经过验证,并提供了 CSV 和 JSON 格式。 |
managedServiceIdentity | 托管标识可用于连接到 Azure 数据资源管理器。 若要使用系统托管标识,请使用“系统”,任何其他标识名称都解释为用户托管标识。 |
配置
下表解释了在 function.json 文件中设置的绑定配置属性。
“function.json”属性 | 说明 |
---|---|
type | 必需。 必须设置为 kusto 。 |
direction | 必需。 必须设置为 out 。 |
name | 必需。 表示函数代码中的查询结果的变量的名称。 |
database | 必需。 必须对其执行查询的数据库。 |
连接 | 必需。 保存连接字符串的变量的“名称”,通过环境变量或函数应用设置解析。 默认为查找变量 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 | 可选。 用于传递已在群集中定义的映射引用的属性。 |
dataFormat | 可选。 默认数据格式为 multijson/json 。 它可以设置为 datasource 格式枚举中支持的文本格式。 示例已经过验证,并提供了 CSV 和 JSON 格式。 |
managedServiceIdentity | 托管标识可用于连接到 Azure 数据资源管理器。 若要使用系统托管标识,请使用“系统”,任何其他标识名称都解释为用户托管标识。 |
在本地开发时,需要将应用程序设置添加到 Values
集合中的 local.settings.json 文件中。
使用情况
该属性的构造函数采用数据库和属性 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 参数中提供的值在运行时使用。