Powiązanie danych wyjściowych usługi Azure SQL dla usługi Azure Functions

Powiązanie danych wyjściowych usługi Azure SQL umożliwia zapisywanie w bazie danych.

Aby uzyskać informacje na temat konfiguracji i konfiguracji, zobacz omówienie.

Ważne

W tym artykule są używane karty do obsługi wielu wersji modelu programowania Node.js. Model w wersji 4 jest ogólnie dostępny i ma bardziej elastyczne i intuicyjne środowisko dla deweloperów języka JavaScript i Języka TypeScript. Aby uzyskać więcej informacji na temat sposobu działania modelu w wersji 4, zapoznaj się z przewodnikiem dewelopera Azure Functions Node.js. Aby dowiedzieć się więcej o różnicach między wersjami 3 i v4, zapoznaj się z przewodnikiem migracji.

Przykłady

Funkcję języka C# można utworzyć przy użyciu jednego z następujących trybów języka C#:

  • Model izolowanego procesu roboczego: skompilowana funkcja języka C#, która jest uruchamiana w procesie roboczym izolowanym od środowiska uruchomieniowego. Proces izolowanego procesu roboczego jest wymagany do obsługi funkcji języka C# uruchomionych w wersjach LTS i innych niż LTS platformy .NET oraz programu .NET Framework.
  • Model przetwarzania: skompilowana funkcja języka C#, która działa w tym samym procesie co środowisko uruchomieniowe usługi Functions.
  • Skrypt języka C#: używany głównie podczas tworzenia funkcji języka C# w witrynie Azure Portal.

Więcej przykładów dla powiązania danych wyjściowych usługi Azure SQL jest dostępnych w repozytorium GitHub.

Ta sekcja zawiera następujące przykłady:

Przykłady odnoszą się do ToDoItem klasy i odpowiedniej tabeli bazy danych:

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; }
    }
}
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
);

Aby zwrócić wiele powiązań wyjściowych w naszych przykładach , utworzymy niestandardowy typ zwracany:

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

Wyzwalacz HTTP, zapis jednego rekordu

W poniższym przykładzie pokazano funkcję języka C#, która dodaje rekord do bazy danych przy użyciu danych podanych w żądaniu HTTP POST jako treści JSON. Obiekt zwracany jest klasą utworzoną OutputType do obsługi zarówno odpowiedzi HTTP, jak i powiązania wyjściowego SQL.

using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using Microsoft.Azure.Functions.Worker.Extensions.Sql;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;

namespace AzureSQL.ToDo
{
    public static class PostToDo
    {
        // create a new ToDoItem from body object
        // uses output binding to insert new item into ToDo table
        [FunctionName("PostToDo")]
        public static async Task<OutputType> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "PostFunction")] HttpRequestData req,
                FunctionContext executionContext)
        {
            var logger = executionContext.GetLogger("PostToDo");
            logger.LogInformation("C# HTTP trigger function processed a request.");

            string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
            ToDoItem toDoItem = JsonConvert.DeserializeObject<ToDoItem>(requestBody);

            // generate a new id for the todo item
            toDoItem.Id = Guid.NewGuid();

            // set Url from env variable ToDoUri
            toDoItem.url = Environment.GetEnvironmentVariable("ToDoUri")+"?id="+toDoItem.Id.ToString();

            // if completed is not provided, default to false
            if (toDoItem.completed == null)
            {
                toDoItem.completed = false;
            }

            return new OutputType()
            {
                ToDoItem = toDoItem,
                HttpResponse = req.CreateResponse(System.Net.HttpStatusCode.Created)
            }
        }
    }

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

        public HttpResponseData HttpResponse { get; set; }
    }
}

Wyzwalacz HTTP, zapis w dwóch tabelach

W poniższym przykładzie pokazano funkcję języka C#, która dodaje rekordy do bazy danych w dwóch różnych tabelach (dbo.ToDo i dbo.RequestLog), używając danych podanych w żądaniu HTTP POST jako treści kodu JSON i wielu powiązań wyjściowych.

CREATE TABLE dbo.RequestLog (
    Id int identity(1,1) primary key,
    RequestTimeStamp datetime2 not null,
    ItemCount int not null
)

Aby użyć dodatkowego powiązania wyjściowego, dodamy klasę i RequestLog zmodyfikujemy naszą OutputType klasę:

using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using Microsoft.Azure.Functions.Worker.Extensions.Sql;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;

namespace AzureSQL.ToDo
{
    public static class PostToDo
    {
        // create a new ToDoItem from body object
        // uses output binding to insert new item into ToDo table
        [FunctionName("PostToDo")]
        public static async Task<OutputType> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "PostFunction")] HttpRequestData req,
                FunctionContext executionContext)
        {
            string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
            ToDoItem toDoItem = JsonConvert.DeserializeObject<ToDoItem>(requestBody);

            // generate a new id for the todo item
            toDoItem.Id = Guid.NewGuid();

            // set Url from env variable ToDoUri
            toDoItem.url = Environment.GetEnvironmentVariable("ToDoUri")+"?id="+toDoItem.Id.ToString();

            // if completed is not provided, default to false
            if (toDoItem.completed == null)
            {
                toDoItem.completed = false;
            }

            requestLog = new RequestLog();
            requestLog.RequestTimeStamp = DateTime.Now;
            requestLog.ItemCount = 1;

            return new OutputType()
            {
                ToDoItem = toDoItem,
                RequestLog = requestLog,
                HttpResponse = req.CreateResponse(System.Net.HttpStatusCode.Created)
            }
        }
    }

    public class RequestLog {
        public DateTime RequestTimeStamp { get; set; }
        public int ItemCount { get; set; }
    }

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

        [SqlOutput("dbo.RequestLog", connectionStringSetting: "SqlConnectionString")]
        public RequestLog RequestLog { get; set; }

        public HttpResponseData HttpResponse { get; set; }
    }

}

Więcej przykładów dla powiązania danych wyjściowych usługi Azure SQL jest dostępnych w repozytorium GitHub.

Ta sekcja zawiera następujące przykłady:

Przykłady odnoszą się do ToDoItem klasy (w osobnym pliku ToDoItem.java) i odpowiedniej tabeli bazy danych:

package com.function;
import java.util.UUID;

public class ToDoItem {
    public UUID Id;
    public int order;
    public String title;
    public String url;
    public boolean completed;

    public ToDoItem() {
    }

    public ToDoItem(UUID Id, int order, String title, String url, boolean completed) {
        this.Id = Id;
        this.order = order;
        this.title = title;
        this.url = url;
        this.completed = completed;
    }
}
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
);

Wyzwalacz HTTP, zapisywanie rekordu w tabeli

W poniższym przykładzie pokazano powiązanie danych wyjściowych SQL w funkcji Języka Java, która dodaje rekord do tabeli przy użyciu danych podanych w żądaniu HTTP POST jako treści JSON. Funkcja przyjmuje dodatkową zależność od biblioteki com.google.code.gson , aby przeanalizować treść JSON.

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.10.1</version>
</dependency>
package com.function;

import java.util.*;
import com.microsoft.azure.functions.annotation.*;
import com.microsoft.azure.functions.*;
import com.microsoft.azure.functions.sql.annotation.SQLOutput;
import com.google.gson.Gson;

import java.util.Optional;

public class PostToDo {
    @FunctionName("PostToDo")
    public HttpResponseMessage run(
            @HttpTrigger(name = "req", methods = {HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> request,
            @SQLOutput(
                name = "toDoItem",
                commandText = "dbo.ToDo",
                connectionStringSetting = "SqlConnectionString")
                OutputBinding<ToDoItem> output) {
        String json = request.getBody().get();
        Gson gson = new Gson();
        ToDoItem newToDo = gson.fromJson(json, ToDoItem.class);

        newToDo.Id = UUID.randomUUID();
        output.setValue(newToDo);

        return request.createResponseBuilder(HttpStatus.CREATED).header("Content-Type", "application/json").body(output).build();
    }
}

Wyzwalacz HTTP, zapis w dwóch tabelach

W poniższym przykładzie pokazano powiązanie danych wyjściowych SQL w funkcji JavaS, która dodaje rekordy do bazy danych w dwóch różnych tabelach (dbo.ToDo i dbo.RequestLog), przy użyciu danych podanych w żądaniu HTTP POST jako treści JSON i wielu powiązań wyjściowych. Funkcja przyjmuje dodatkową zależność od biblioteki com.google.code.gson , aby przeanalizować treść JSON.

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.10.1</version>
</dependency>

Druga tabela dbo.RequestLogodpowiada następującej definicji:

CREATE TABLE dbo.RequestLog (
    Id INT IDENTITY(1,1) PRIMARY KEY,
    RequestTimeStamp DATETIME2 NOT NULL DEFAULT(GETDATE()),
    ItemCount INT NOT NULL
)

i java, klasa w :RequestLog.java

package com.function;

import java.util.Date;

public class RequestLog {
    public int Id;
    public Date RequestTimeStamp;
    public int ItemCount;

    public RequestLog() {
    }

    public RequestLog(int Id, Date RequestTimeStamp, int ItemCount) {
        this.Id = Id;
        this.RequestTimeStamp = RequestTimeStamp;
        this.ItemCount = ItemCount;
    }
}
package com.function;

import java.util.*;
import com.microsoft.azure.functions.annotation.*;
import com.microsoft.azure.functions.*;
import com.microsoft.azure.functions.sql.annotation.SQLOutput;
import com.google.gson.Gson;

import java.util.Optional;

public class PostToDoWithLog {
    @FunctionName("PostToDoWithLog")
    public HttpResponseMessage run(
            @HttpTrigger(name = "req", methods = {HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> request,
            @SQLOutput(
                name = "toDoItem",
                commandText = "dbo.ToDo",
                connectionStringSetting = "SqlConnectionString")
                OutputBinding<ToDoItem> output,
            @SQLOutput(
                name = "requestLog",
                commandText = "dbo.RequestLog",
                connectionStringSetting = "SqlConnectionString")
                OutputBinding<RequestLog> outputLog,
            final ExecutionContext context) {
        context.getLogger().info("Java HTTP trigger processed a request.");

        String json = request.getBody().get();
        Gson gson = new Gson();
        ToDoItem newToDo = gson.fromJson(json, ToDoItem.class);
        newToDo.Id = UUID.randomUUID();
        output.setValue(newToDo);

        RequestLog newLog = new RequestLog();
        newLog.ItemCount = 1;
        outputLog.setValue(newLog);

        return request.createResponseBuilder(HttpStatus.CREATED).header("Content-Type", "application/json").body(output).build();
    }
}

Więcej przykładów dla powiązania danych wyjściowych usługi Azure SQL jest dostępnych w repozytorium GitHub.

Ta sekcja zawiera następujące przykłady:

Przykłady odnoszą się do tabeli bazy danych:

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
);

Wyzwalacz HTTP, zapisywanie rekordów w tabeli

W poniższym przykładzie pokazano powiązanie danych wyjściowych SQL, które dodaje rekordy do tabeli przy użyciu danych podanych w żądaniu HTTP POST jako treści JSON.

import { app, HttpRequest, HttpResponseInit, InvocationContext, output } from '@azure/functions';

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

export async function httpTrigger1(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
    context.log('HTTP trigger and SQL output binding function processed a request.');

    const body = await request.json();
    context.extraOutputs.set(sqlOutput, body);
    return { status: 201 };
}

app.http('httpTrigger1', {
    methods: ['POST'],
    authLevel: 'anonymous',
    extraOutputs: [sqlOutput],
    handler: httpTrigger1,
});
const { app, output } = require('@azure/functions');

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

app.http('httpTrigger1', {
    methods: ['POST'],
    authLevel: 'anonymous',
    extraOutputs: [sqlOutput],
    handler: async (request, context) => {
        context.log('HTTP trigger and SQL output binding function processed a request.');

        const body = await request.json();
        context.extraOutputs.set(sqlOutput, body);
        return { status: 201 };
    },
});

Wyzwalacz HTTP, zapis w dwóch tabelach

W poniższym przykładzie pokazano powiązanie danych wyjściowych SQL, które dodaje rekordy do bazy danych w dwóch różnych tabelach (dbo.ToDo i dbo.RequestLog), przy użyciu danych podanych w żądaniu HTTP POST jako treści JSON i wielu powiązań wyjściowych.

Druga tabela dbo.RequestLogodpowiada następującej definicji:

CREATE TABLE dbo.RequestLog (
    Id int identity(1,1) primary key,
    RequestTimeStamp datetime2 not null,
    ItemCount int not null
)
import { app, HttpRequest, HttpResponseInit, InvocationContext, output } from '@azure/functions';

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

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

export async function httpTrigger1(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
    context.log('HTTP trigger and SQL output binding function processed a request.');

    const newLog = {
        RequestTimeStamp: Date.now(),
        ItemCount: 1,
    };
    context.extraOutputs.set(sqlRequestLogOutput, newLog);

    const body = await request.json();
    context.extraOutputs.set(sqlTodoOutput, body);

    return { status: 201 };
}

app.http('httpTrigger1', {
    methods: ['POST'],
    authLevel: 'anonymous',
    extraOutputs: [sqlTodoOutput, sqlRequestLogOutput],
    handler: httpTrigger1,
});
const { app, output } = require('@azure/functions');

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

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

app.http('httpTrigger1', {
    methods: ['POST'],
    authLevel: 'anonymous',
    extraOutputs: [sqlTodoOutput, sqlRequestLogOutput],
    handler: async (request, context) => {
        context.log('HTTP trigger and SQL output binding function processed a request.');

        const newLog = {
            RequestTimeStamp: Date.now(),
            ItemCount: 1,
        };
        context.extraOutputs.set(sqlRequestLogOutput, newLog);

        const body = await request.json();
        context.extraOutputs.set(sqlTodoOutput, body);

        return { status: 201 };
    },
});

Więcej przykładów dla powiązania danych wyjściowych usługi Azure SQL jest dostępnych w repozytorium GitHub.

Ta sekcja zawiera następujące przykłady:

Przykłady odnoszą się do tabeli bazy danych:

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
);

Wyzwalacz HTTP, zapisywanie rekordów w tabeli

W poniższym przykładzie pokazano powiązanie danych wyjściowych SQL w pliku function.json i funkcję programu PowerShell, która dodaje rekordy do tabeli przy użyciu danych podanych w żądaniu HTTP POST jako treści JSON.

Poniżej przedstawiono powiązanie danych w pliku function.json:

{
    "authLevel": "anonymous",
    "type": "httpTrigger",
    "direction": "in",
    "name": "req",
    "methods": [
        "post"
    ]
},
{
    "type": "http",
    "direction": "out",
    "name": "res"
},
{
    "name": "todoItems",
    "type": "sql",
    "direction": "out",
    "commandText": "dbo.ToDo",
    "connectionStringSetting": "SqlConnectionString"
}

W sekcji konfiguracji opisano te właściwości.

Poniżej przedstawiono przykładowy kod programu PowerShell dla funkcji w run.ps1 pliku :


```powershell
using namespace System.Net

param($Request)

Write-Host "PowerShell function with SQL Output Binding processed a request."

# Update req_body with the body of the request
$req_body = $Request.Body

# Assign the value we want to pass to the SQL Output binding. 
# The -Name value corresponds to the name property in the function.json for the binding
Push-OutputBinding -Name todoItems -Value $req_body

Push-OutputBinding -Name res -Value ([HttpResponseContext]@{
    StatusCode = [HttpStatusCode]::OK
    Body = $req_body
})

Wyzwalacz HTTP, zapis w dwóch tabelach

W poniższym przykładzie pokazano powiązanie danych wyjściowych SQL w pliku function.json i funkcję programu PowerShell, która dodaje rekordy do bazy danych w dwóch różnych tabelach (dbo.ToDo i dbo.RequestLog), przy użyciu danych podanych w żądaniu HTTP POST jako treści JSON i wielu powiązań wyjściowych.

Druga tabela dbo.RequestLogodpowiada następującej definicji:

CREATE TABLE dbo.RequestLog (
    Id int identity(1,1) primary key,
    RequestTimeStamp datetime2 not null,
    ItemCount int not null
)

Poniżej przedstawiono powiązanie danych w pliku function.json:

{
    "authLevel": "anonymous",
    "type": "httpTrigger",
    "direction": "in",
    "name": "req",
    "methods": [
        "post"
    ]
},
{
    "type": "http",
    "direction": "out",
    "name": "res"
},
{
    "name": "todoItems",
    "type": "sql",
    "direction": "out",
    "commandText": "dbo.ToDo",
    "connectionStringSetting": "SqlConnectionString"
},
{
    "name": "requestLog",
    "type": "sql",
    "direction": "out",
    "commandText": "dbo.RequestLog",
    "connectionStringSetting": "SqlConnectionString"
}

W sekcji konfiguracji opisano te właściwości.

Poniżej przedstawiono przykładowy kod programu PowerShell dla funkcji w run.ps1 pliku :

using namespace System.Net

param($Request)

Write-Host "PowerShell function with SQL Output Binding processed a request."

# Update req_body with the body of the request
$req_body = $Request.Body
$new_log = @{
    RequestTimeStamp = [DateTime]::Now
    ItemCount = 1
}

Push-OutputBinding -Name todoItems -Value $req_body
Push-OutputBinding -Name requestLog -Value $new_log

Push-OutputBinding -Name res -Value ([HttpResponseContext]@{
    StatusCode = [HttpStatusCode]::OK
    Body = $req_body
})

Więcej przykładów dla powiązania danych wyjściowych usługi Azure SQL jest dostępnych w repozytorium GitHub.

Ta sekcja zawiera następujące przykłady:

Przykłady odnoszą się do tabeli bazy danych:

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
);

Wyzwalacz HTTP, zapisywanie rekordów w tabeli

Poniższy przykład przedstawia powiązanie danych wyjściowych SQL w pliku function.json i funkcję języka Python, która dodaje rekordy do tabeli przy użyciu danych podanych w żądaniu HTTP POST jako treści JSON.

Poniżej przedstawiono powiązanie danych w pliku function.json:

{
    "authLevel": "anonymous",
    "type": "httpTrigger",
    "direction": "in",
    "name": "req",
    "methods": [
        "post"
    ]
},
{
    "type": "http",
    "direction": "out",
    "name": "$return"
},
{
    "name": "todoItems",
    "type": "sql",
    "direction": "out",
    "commandText": "dbo.ToDo",
    "connectionStringSetting": "SqlConnectionString"
}

W sekcji konfiguracji opisano te właściwości.

Poniżej przedstawiono przykładowy kod w języku Python:

import logging
import azure.functions as func


def main(req: func.HttpRequest, todoItems: func.Out[func.SqlRow]) -> func.HttpResponse:
    logging.info('Python HTTP trigger and SQL output binding function processed a request.')

    try:
        req_body = req.get_json()
        rows = func.SqlRowList(map(lambda r: func.SqlRow.from_dict(r), req_body))
    except ValueError:
        pass

    if req_body:
        todoItems.set(rows)
        return func.HttpResponse(
            todoItems.to_json(),
            status_code=201,
            mimetype="application/json"
        )
    else:
        return func.HttpResponse(
            "Error accessing request body",
            status_code=400
        )

Wyzwalacz HTTP, zapis w dwóch tabelach

W poniższym przykładzie pokazano powiązanie danych wyjściowych SQL w pliku function.json i funkcję języka Python, która dodaje rekordy do bazy danych w dwóch różnych tabelach (dbo.ToDo i dbo.RequestLog), przy użyciu danych podanych w żądaniu HTTP POST jako treści JSON i wielu powiązań wyjściowych.

Druga tabela dbo.RequestLogodpowiada następującej definicji:

CREATE TABLE dbo.RequestLog (
    Id int identity(1,1) primary key,
    RequestTimeStamp datetime2 not null,
    ItemCount int not null
)

Poniżej przedstawiono powiązanie danych w pliku function.json:

{
    "authLevel": "anonymous",
    "type": "httpTrigger",
    "direction": "in",
    "name": "req",
    "methods": [
        "post"
    ]
},
{
    "type": "http",
    "direction": "out",
    "name": "$return"
},
{
    "name": "todoItems",
    "type": "sql",
    "direction": "out",
    "commandText": "dbo.ToDo",
    "connectionStringSetting": "SqlConnectionString"
},
{
    "name": "requestLog",
    "type": "sql",
    "direction": "out",
    "commandText": "dbo.RequestLog",
    "connectionStringSetting": "SqlConnectionString"
}

W sekcji konfiguracji opisano te właściwości.

Poniżej przedstawiono przykładowy kod w języku Python:

import logging
from datetime import datetime
import azure.functions as func


def main(req: func.HttpRequest, todoItems: func.Out[func.SqlRow], requestLog: func.Out[func.SqlRow]) -> func.HttpResponse:
    logging.info('Python HTTP trigger and SQL output binding function processed a request.')

    try:
        req_body = req.get_json()
        rows = func.SqlRowList(map(lambda r: func.SqlRow.from_dict(r), req_body))
    except ValueError:
        pass

    requestLog.set(func.SqlRow({
        "RequestTimeStamp": datetime.now(),
        "ItemCount": 1
    }))

    if req_body:
        todoItems.set(rows)
        return func.HttpResponse(
            todoItems.to_json(),
            status_code=201,
            mimetype="application/json"
        )
    else:
        return func.HttpResponse(
            "Error accessing request body",
            status_code=400
        )

Atrybuty

Biblioteka języka C# używa atrybutu SqlAttribute do deklarowania powiązań SQL w funkcji, która ma następujące właściwości:

Właściwość atrybutu opis
Commandtext Wymagany. Nazwa tabeli zapisywanej przez powiązanie.
Połączenie ionStringSetting Wymagany. Nazwa ustawienia aplikacji zawierającego parametry połączenia dla bazy danych, do której są zapisywane dane. Nie jest to rzeczywista parametry połączenia i zamiast tego musi zostać rozpoznana zmienna środowiskowa.

Adnotacje

W bibliotece środowiska uruchomieniowego funkcji Języka Java użyj @SQLOutput adnotacji (com.microsoft.azure.functions.sql.annotation.SQLOutput) dla parametrów, których wartość pochodzi z usługi Azure SQL. Ta adnotacja obsługuje następujące elementy:

Element opis
Commandtext Wymagany. Nazwa tabeli zapisywanej przez powiązanie.
connectionStringSetting Wymagany. Nazwa ustawienia aplikacji zawierającego parametry połączenia dla bazy danych, do której są zapisywane dane. Nie jest to rzeczywista parametry połączenia i zamiast tego musi zostać rozpoznana zmienna środowiskowa.
name Wymagany. Unikatowa nazwa powiązania funkcji.

Konfigurowanie

W poniższej tabeli opisano właściwości, które można ustawić dla options obiektu przekazanego output.sql() do metody .

Właściwości opis
Commandtext Wymagany. Nazwa tabeli zapisywanej przez powiązanie.
connectionStringSetting Wymagany. Nazwa ustawienia aplikacji zawierającego parametry połączenia dla bazy danych, do której są zapisywane dane. Nie jest to rzeczywista parametry połączenia i zamiast tego musi zostać rozpoznana zmienna środowiskowa. Opcjonalne słowa kluczowe w wartości parametry połączenia są dostępne do uściślinia łączności powiązań SQL.

Konfigurowanie

W poniższej tabeli opisano właściwości konfiguracji powiązania ustawione w pliku function.json .

function.json, właściwość opis
type Wymagany. Musi być ustawiona wartość sql.
direction Wymagany. Musi być ustawiona wartość out.
name Wymagany. Nazwa zmiennej reprezentującej jednostkę w kodzie funkcji.
Commandtext Wymagany. Nazwa tabeli zapisywanej przez powiązanie.
connectionStringSetting Wymagany. Nazwa ustawienia aplikacji zawierającego parametry połączenia dla bazy danych, do której są zapisywane dane. Nie jest to rzeczywista parametry połączenia i zamiast tego musi zostać rozpoznana zmienna środowiskowa. Opcjonalne słowa kluczowe w wartości parametry połączenia są dostępne do uściślinia łączności powiązań SQL.

Podczas tworzenia aplikacji lokalnie dodaj ustawienia aplikacji w pliku local.settings.json w kolekcji Values .

Sposób użycia

Właściwość CommandText to nazwa tabeli, w której mają być przechowywane dane. Nazwa ustawienia parametry połączenia odpowiada ustawieniu aplikacji zawierającemu parametry połączenia wystąpienia usługi Azure SQL lub programu SQL Server.

Powiązania wyjściowe używają instrukcji T-SQL MERGE , która wymaga uprawnień SELECT w docelowej bazie danych.

Jeśli wystąpi wyjątek podczas wykonywania powiązania danych wyjściowych SQL, kod funkcji przestaje działać. Może to spowodować zwrócenie kodu błędu, takiego jak wyzwalacz HTTP zwracający kod błędu 500. IAsyncCollector Jeśli element jest używany w funkcji .NET, kod funkcji może obsługiwać wyjątki zgłaszane przez wywołanie metody FlushAsync().

Następne kroki