Azure Tables-Ausgabebindungen für Azure Functions

Verwenden Sie eine Azure Tables-Ausgabebindung, um Entitäten in eine Tabelle in Azure Cosmos DB for Table oder Azure Table Storage zu schreiben.

Informationen zu Setup- und Konfigurationsdetails finden Sie in der Übersicht.

Hinweis

Diese Ausgabebindung unterstützt nur das Erstellen neuer Entitäten in einer Tabelle. Wenn Sie eine vorhandene Entität aus Ihrem Funktionscode aktualisieren müssen, verwenden Sie stattdessen direkt ein Azure Tables SDK.

Wichtig

In diesem Artikel werden Registerkarten verwendet, um mehrere Versionen des Node.js-Programmiermodells zu unterstützen. Das v4-Modell ist allgemein verfügbar und bietet JavaScript- und TypeScript-Entwicklern eine flexiblere und intuitivere Erfahrung. Weitere Informationen zur Funktionsweise des v4-Modells finden Sie im Azure Functions Node.js-Entwicklerhandbuch. Weitere Informationen zu den Unterschieden zwischen v3 und v4 finden Sie im Migrationshandbuch.

Beispiel

Go-Support ist derzeit nicht für diese Bindung verfügbar.

Eine C#-Funktion kann mit einem der folgenden C#-Modi erstellt werden:

  • Isoliertes Workermodell: Kompilierte C#-Funktion, die in einem Workerprozess ausgeführt wird, der von der Runtime isoliert ist. Ein isolierter Workerprozess ist erforderlich, um C#-Funktionen zu unterstützen, die in LTS- und Nicht-LTS-Versionen von .NET und .NET Framework ausgeführt werden. Erweiterungen für isolierte Workerprozessfunktionen verwenden Microsoft.Azure.Functions.Worker.Extensions.*-Namespaces.
  • In-Process-Modell: Kompilierte C#-Funktion, die im gleichen Prozess wie die Functions-Runtime ausgeführt wird. In einer Variante dieses Modells kann Functions mithilfe von C#-Skripts ausgeführt werden. Dies wird hauptsächlich für die Bearbeitung im C#-Portal unterstützt. Erweiterungen für In-Process-Funktionen verwenden Microsoft.Azure.WebJobs.Extensions.*-Namespaces.

Wichtig

Die Unterstützung für das In-Process-Modell endet am 10. November 2026. Es wird dringend empfohlen, Ihre Apps zum isolierten Workermodell zu migrieren, um den vollständigen Support zu ermöglichen.

Die folgende MyTableData-Klasse stellt eine Datenzeile in der Tabelle dar:

public class MyTableData : Azure.Data.Tables.ITableEntity
{
    public string Text { get; set; }

    public string PartitionKey { get; set; }
    public string RowKey { get; set; }
    public DateTimeOffset? Timestamp { get; set; }
    public ETag ETag { get; set; }
}

Die folgende Funktion, die von einem Queue Storage-Trigger gestartet wird, schreibt eine neue MyDataTable-Entität in eine Tabelle mit dem Namen OutputTable.

[Function("TableFunction")]
[TableOutput("OutputTable", Connection = "AzureWebJobsStorage")]
public static MyTableData Run(
    [QueueTrigger("table-items")] string input,
    [TableInput("MyTable", "<PartitionKey>", "{queueTrigger}")] MyTableData tableInput,
    FunctionContext context)
{
    var logger = context.GetLogger("TableFunction");

    logger.LogInformation($"PK={tableInput.PartitionKey}, RK={tableInput.RowKey}, Text={tableInput.Text}");

    return new MyTableData()
    {
        PartitionKey = "queue",
        RowKey = Guid.NewGuid().ToString(),
        Text = $"Output record with rowkey {input} created at {DateTime.Now}"
    };
}

Das folgende Beispiel zeigt eine Java-Funktion, die einen HTTP-Trigger zum Schreiben einer einzelnen Tabellenzeile verwendet.

public class Person {
    private String PartitionKey;
    private String RowKey;
    private String Name;

    public String getPartitionKey() {return this.PartitionKey;}
    public void setPartitionKey(String key) {this.PartitionKey = key; }
    public String getRowKey() {return this.RowKey;}
    public void setRowKey(String key) {this.RowKey = key; }
    public String getName() {return this.Name;}
    public void setName(String name) {this.Name = name; }
}

public class AddPerson {

    @FunctionName("addPerson")
    public HttpResponseMessage get(
            @HttpTrigger(name = "postPerson", methods = {HttpMethod.POST}, authLevel = AuthorizationLevel.FUNCTION, route="persons/{partitionKey}/{rowKey}") HttpRequestMessage<Optional<Person>> request,
            @BindingName("partitionKey") String partitionKey,
            @BindingName("rowKey") String rowKey,
            @TableOutput(name="person", partitionKey="{partitionKey}", rowKey = "{rowKey}", tableName="%MyTableName%", connection="MyConnectionString") OutputBinding<Person> person,
            final ExecutionContext context) {

        Person outPerson = new Person();
        outPerson.setPartitionKey(partitionKey);
        outPerson.setRowKey(rowKey);
        outPerson.setName(request.getBody().get().getName());

        person.setValue(outPerson);

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

Das folgende Beispiel zeigt eine Java-Funktion, die einen HTTP-Trigger zum Schreiben mehrerer Tabellenzeilen verwendet.

public class Person {
    private String PartitionKey;
    private String RowKey;
    private String Name;

    public String getPartitionKey() {return this.PartitionKey;}
    public void setPartitionKey(String key) {this.PartitionKey = key; }
    public String getRowKey() {return this.RowKey;}
    public void setRowKey(String key) {this.RowKey = key; }
    public String getName() {return this.Name;}
    public void setName(String name) {this.Name = name; }
}

public class AddPersons {

    @FunctionName("addPersons")
    public HttpResponseMessage get(
            @HttpTrigger(name = "postPersons", methods = {HttpMethod.POST}, authLevel = AuthorizationLevel.FUNCTION, route="persons/") HttpRequestMessage<Optional<Person[]>> request,
            @TableOutput(name="person", tableName="%MyTableName%", connection="MyConnectionString") OutputBinding<Person[]> persons,
            final ExecutionContext context) {

        persons.setValue(request.getBody().get());

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

Das folgende Beispiel zeigt eine Tabellenausgabebindung, die mehrere Tabellenentitäten schreibt.

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

const tableOutput = output.table({
    tableName: 'Person',
    connection: 'MyStorageConnectionAppSetting',
});

interface PersonEntity {
    PartitionKey: string;
    RowKey: string;
    Name: string;
}

export async function httpTrigger1(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
    const rows: PersonEntity[] = [];
    for (let i = 1; i < 10; i++) {
        rows.push({
            PartitionKey: 'Test',
            RowKey: i.toString(),
            Name: `Name ${i}`,
        });
    }
    context.extraOutputs.set(tableOutput, rows);
    return { status: 201 };
}

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

const tableOutput = output.table({
    tableName: 'Person',
    connection: 'MyStorageConnectionAppSetting',
});

app.http('httpTrigger1', {
    methods: ['POST'],
    authLevel: 'anonymous',
    extraOutputs: [tableOutput],
    handler: async (request, context) => {
        const rows = [];
        for (let i = 1; i < 10; i++) {
            rows.push({
                PartitionKey: 'Test',
                RowKey: i.toString(),
                Name: `Name ${i}`,
            });
        }
        context.extraOutputs.set(tableOutput, rows);
        return { status: 201 };
    },
});

Das folgende Beispiel veranschaulicht, wie mehrere Entitäten aus einer Funktion in eine Tabelle geschrieben werden.

Bindungskonfiguration in function.json:

{
  "bindings": [
    {
      "name": "InputData",
      "type": "manualTrigger",
      "direction": "in"
    },
    {
      "tableName": "Person",
      "connection": "MyStorageConnectionAppSetting",
      "name": "TableBinding",
      "type": "table",
      "direction": "out"
    }
  ],
  "disabled": false
}

PowerShell-Code in run.ps1:

param($InputData, $TriggerMetadata)

foreach ($i in 1..10) {
    Push-OutputBinding -Name TableBinding -Value @{
        PartitionKey = 'Test'
        RowKey = "$i"
        Name = "Name $i"
    }
}

Das folgende Beispiel zeigt, wie Sie die Tabellenspeicherausgabe-Bindung verwenden. Konfigurieren Sie die table-Bindung in der Datei function.json, indem Sie name, tableName, partitionKey und connection Werte zuweisen:

Die folgende Funktion generiert eine eindeutige UUI für den rowKey-Wert und speichert die Nachricht dauerhaft im Tabellenspeicher.

import logging
import uuid
import json
import azure.functions as func

app = func.FunctionApp()

@app.route(route="table_out_binding")
@app.table_output(arg_name="message",
                  connection="AzureWebJobsStorage",
                  table_name="messages")
def table_out_binding(req: func.HttpRequest, message: func.Out[str]):
    row_key = str(uuid.uuid4())
    data = {
        "Name": "Output binding message",
        "PartitionKey": "message",
        "RowKey": row_key
    }
    table_json = json.dumps(data)
    message.set(table_json)
    return table_json

Attribute

Sowohl C#-Bibliotheken des Typs In-Process als auch des Typs Isolierter Workerprozess verwenden Attribute zum Definieren der Funktion. Das C#-Skript verwendet stattdessen eine Konfigurationsdatei function.json, wie im C#-Skript-Handbuch beschrieben.

In C#-Klassenbibliotheken unterstützt TableInputAttribute die folgenden Eigenschaften:

Attributeigenschaft BESCHREIBUNG
Tabellenname Der Name der Tabelle, in die geschrieben werden soll.
PartitionKey Der Partitionsschlüssel der zu schreibenden Tabellenentität.
Zeilenschlüssel Der Zeilenschlüssel der zu schreibenden Tabellenentität.
Verbindung Der Name einer App-Einstellung oder Einstellungssammlung, die angibt, wie eine Verbindung mit dem Tabellendienst hergestellt wird. Siehe Verbindungen.

Anmerkungen

Verwenden Sie in der Java-Funktionslaufzeitbibliothek die TableOutput-Anmerkung für Parameter, um Werte in Ihre Tabellen zu schreiben. Das Attribut unterstützt die folgenden Elemente:

Element BESCHREIBUNG
Name Der Variablenname, der in Funktionscode zur Darstellung der Tabelle oder Entität verwendet wird.
Datatype Definiert, wie die Functions-Runtime den Parameterwert behandeln soll. Weitere Informationen finden Sie unter dataType.
tableName Der Name der Tabelle, in die geschrieben werden soll.
partitionKey Der Partitionsschlüssel der zu schreibenden Tabellenentität.
rowKey Der Zeilenschlüssel der zu schreibenden Tabellenentität.
Verbindung Der Name einer App-Einstellung oder Einstellungssammlung, die angibt, wie eine Verbindung mit dem Tabellendienst hergestellt wird. Siehe Verbindungen.

Konfiguration

In der folgenden Tabelle werden die Eigenschaften erläutert, die Sie für das options-Objekt festlegen können, das an die output.table()-Methode übergeben wurde.

Eigenschaft BESCHREIBUNG
tableName Der Name der Tabelle, in die geschrieben werden soll.
partitionKey Der Partitionsschlüssel der zu schreibenden Tabellenentität.
rowKey Der Zeilenschlüssel der zu schreibenden Tabellenentität.
Verbindung Der Name einer App-Einstellung oder Einstellungssammlung, die angibt, wie eine Verbindung mit dem Tabellendienst hergestellt wird. Siehe Verbindungen.

Konfiguration

Die folgende Tabelle gibt Aufschluss über die Bindungskonfigurationseigenschaften, die Sie in der Datei function.json festlegen.

function.json-Eigenschaft BESCHREIBUNG
Typ Muss auf table festgelegt sein. Diese Eigenschaft wird automatisch festgelegt, wenn Sie die Bindung im Azure Portal erstellen.
Richtung Muss auf out festgelegt sein. Diese Eigenschaft wird automatisch festgelegt, wenn Sie die Bindung im Azure Portal erstellen.
Name Der Variablenname, der in Funktionscode zur Darstellung der Tabelle oder Entität verwendet wird. Legen Sie diesen Wert auf $return fest, um auf den Rückgabewert der Funktion zu verweisen.
tableName Der Name der Tabelle, in die geschrieben werden soll.
partitionKey Der Partitionsschlüssel der zu schreibenden Tabellenentität.
rowKey Der Zeilenschlüssel der zu schreibenden Tabellenentität.
Verbindung Der Name einer App-Einstellung oder Einstellungssammlung, die angibt, wie eine Verbindung mit dem Tabellendienst hergestellt wird. Siehe Verbindungen.

Wenn Sie die Entwicklung lokal ausführen, fügen Sie Ihre Anwendungseinstellungen in der Datei local.settings.json in der Values-Sammlung hinzu.

Verbindungen

Die Eigenschaft connection wird in den Anwendungseinstellungen auf einen Schlüssel gesetzt, der einen Wert zurückgibt, der von der Functions-Laufzeit verwendet wird, um sich mit dem von der Erweiterung verwendeten Speicherkonto zu verbinden. Der Wert der Verbindungseigenschaftseinstellung hängt vom Verbindungstyp ab:

  • Managed Identity Connection: Die connection Eigenschaft wird <CONNECTION_NAME_PREFIX> von einer Gruppe von Settings geteilt, die zusammen eine identitätsbasierte Verbindung zum Speicherkonto definieren. Weitere Informationen finden Sie unter Identitätsverbindungen definieren.
  • Key Vault-Referenz: Die connection Property-Einstellung gibt eine Azure Key Vault-Referenz an den Ort zurück, an dem die Verbindungszeichenfolge zentral verwaltet wird. Weitere Informationen finden Sie unter Define Key Vault connections.
  • App Configuration Reference: Die connection Property-Einstellung liefert eine Azure App Configuration-Referenz, die eine Verbindungszeichenfolge oder eine Key Vault-Referenz zurückgibt. Weitere Informationen finden Sie unter Azure App Configuration im Artikel über Verbindungen.
  • Connection string: Die connection Eigenschaftseinstellung gibt den tatsächlichen Storage Account Verbindungszeichenfolge zurück. Da der Verbindungszeichenfolge gemeinsame geheime Schlüssel enthält, solltest du, wenn möglich, eine verwaltete Identitätsverbindung in Betracht ziehen. Weitere Informationen finden Sie unter Zusammenhänge definieren.

Um mehr über Bindungsverbindungen zu erfahren, siehe Verbindung verwalten in Azure Functions. Um eine Verbindungszeichenfolge zu erhalten, führen Sie die unter Manage Speicherkontozugriffsschlüssel gezeigten Schritte aus.

Wenn du einen Schlüssel oder ein Schlüsselpräfix mit dem Namen AzureWebJobsStorage oder einen leeren String einsetztconnection, verwendet die Binding-Erweiterung das Standard-Host-Speicherkonto. Weitere Informationen finden Sie unter Speicherleistung optimieren.

Verbrauch

Die Verwendung der Bindung hängt von der Version des Erweiterungspakets und der C#-Modalität ab, die in Ihrer Funktions-App verwendet wird. Dies kann eine der folgenden Modalitäten sein:

Eine Klassenbibliothek in einem isolierten Workerprozess ist eine kompilierte C#-Funktion, die in einem von der Runtime isolierten Prozess ausgeführt wird.

Wählen Sie eine Version aus, um Syntaxdetails für den Modus und die Version anzuzeigen.

Wenn die Funktion in eine einzelne Entität schreiben soll, kann die Blobausgabebindung an die folgenden Typen gebunden werden:

type BESCHREIBUNG
Einen serialisierbaren JSON-Typ, der [ITableEntity] implementiert. Functions versucht, einen POCO-Typ (Plain-Old CLR Object) als die Entität zu serialisieren. Der Typ muss [ITableEntity] implementieren oder über eine Zeichenfolgeneigenschaft RowKey und eine Zeichenfolgeneigenschaft PartitionKey verfügen.

Wenn die Funktion in mehrere Entitäten schreiben soll, kann die Blobausgabebindung an die folgenden Typen gebunden werden:

type BESCHREIBUNG
T[], wobei T einer der einzelnen Entitätstypen ist. Ein Array, das mehrere Entitäten enthält. Jeder Eintrag stellt eine Entität dar.

Erstellen und verwenden Sie für andere Ausgabeszenarien einen TableClient mit anderen Typen aus Azure.Data.Tables direkt. Ein Beispiel für die Verwendung der Abhängigkeitsinjektion zum Erstellen eines Clienttyps aus dem Azure SDK finden Sie unter Registrieren von Azure-Clients .

Es gibt zwei Optionen für das Ausgeben einer Tabellenspeicherzeile aus einer Funktion mittels der TableStorageOutput-Anmerkung:

Optionen BESCHREIBUNG
Rückgabewert Wenn Sie die Anmerkung auf die Funktion selbst anwenden, wird der Rückgabewert der Funktion als Tabellenspeicherzeile persistent gespeichert.
Imperativ Um die Tabellenzeile explizit festzulegen, wenden Sie die Anmerkung auf einen bestimmten Parameter des Typs OutputBinding<T> an, wobei T die Eigenschaften PartitionKey und RowKey enthält. Sie können diese Eigenschaften begleiten, indem Sie ITableEntity implementieren oder von TableEntity erben.

Legen Sie die Ausgabezeilendaten fest, indem Sie den Wert zurückgeben oder context.extraOutputs.set() verwenden.

Um in Tabellendaten zu schreiben, verwenden Sie das Cmdlet Push-OutputBinding, und legen Sie die Parameter -Name TableBinding und -Value entsprechend den Zeilendaten fest. Weitere Details finden Sie im PowerShell-Beispiel.

Es gibt zwei Optionen für das Ausgeben einer Tabellenspeicherzeilen-Nachricht aus einer Funktion:

Optionen BESCHREIBUNG
Rückgabewert Legen Sie die Eigenschaft name in function.json auf $return fest. Mit dieser Konfiguration wird der Rückgabewert der Funktion als Tabellenspeicherzeile persistent gespeichert.
Imperativ Übergeben Sie einen Wert an die set-Methode des Parameters, der als Out-Typ deklariert ist. Der an set übergebene Wert wird als Tabellenzeile persistent gespeichert.

Spezifische Syntaxdetails finden Sie unter Beispiel.

Ausnahmen und Rückgabecodes

Bindung Verweis
Tabelle Tabellenfehlercodes
Blob, Tabelle, Warteschlange Speicherfehlercodes
Blob, Tabelle, Warteschlange Problembehandlung

Nächste Schritte