你当前正在访问 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# 函数时使用。

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 数据资源管理器输出绑定,将记录添加到数据库内两个不同的表(ProductProductChangeLog)中。 该函数使用 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 函数,该函数用于将记录添加到数据库中两个不同的表(ProductsProductsChangeLog)中。 该函数使用 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 函数,该函数用于将记录添加到数据库中两个不同的表(ProductsProductsChangeLog)中。 该函数使用 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 文件中。

使用情况

该属性的构造函数采用数据库和属性 TableNameMappingRefDataFormat 以及连接设置名称。 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 参数中提供的值在运行时使用。

后续步骤

从表中读取数据(输入绑定)