Azure Tables-indatabindningar för Azure Functions

Använd Azure Tables-indatabindningen för att läsa en tabell i Azure Cosmos DB för Table eller Azure Table Storage.

Information om konfiguration och konfigurationsinformation finns i översikten.

Viktigt!

Den här artikeln använder flikar för att stödja flera versioner av Node.js programmeringsmodellen. V4-modellen är allmänt tillgänglig och är utformad för att ha en mer flexibel och intuitiv upplevelse för JavaScript- och TypeScript-utvecklare. Mer information om hur v4-modellen fungerar finns i utvecklarguiden för Azure Functions Node.js. Mer information om skillnaderna mellan v3 och v4 finns i migreringsguiden.

Exempel

Användningen av bindningen beror på tilläggspaketversionen och den C#-modalitet som används i funktionsappen, vilket kan vara något av följande:

Ett isolerat arbetsprocessklassbibliotek kompilerade C#-funktioner körs i en process som är isolerad från körningen.

Välj en version för att se exempel för läget och versionen.

Följande MyTableData klass representerar en rad med data i tabellen:

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

Följande funktion, som startas av en Queue Storage-utlösare, läser en radnyckel från kön, som används för att hämta raden från indatatabellen. Uttrycket {queueTrigger} binder radnyckeln till meddelandemetadata, som är meddelandesträngen.

[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}"
    };
}

Följande köutlösta funktion returnerar de första 5 entiteterna som en IEnumerable<T>, med partitionsnyckelvärdet inställt som kömeddelande.

[Function("TestFunction")]
public static void Run([QueueTrigger("myqueue", Connection = "AzureWebJobsStorage")] string partition,
    [TableInput("inTable", "{queueTrigger}", Take = 5, Filter = "Text eq 'test'", 
    Connection = "AzureWebJobsStorage")] IEnumerable<MyTableData> tableInputs,
    FunctionContext context)
{
    var logger = context.GetLogger("TestFunction");
    logger.LogInformation(partition);
    foreach (MyTableData tableInput in tableInputs)
    {
        logger.LogInformation($"PK={tableInput.PartitionKey}, RK={tableInput.RowKey}, Text={tableInput.Text}");
    }
}

Egenskaperna Filter och Take används för att begränsa antalet entiteter som returneras.

I följande exempel visas en HTTP-utlöst funktion som returnerar en lista över personobjekt som finns i en angiven partition i Table Storage. I exemplet extraheras partitionsnyckeln från http-vägen och tableName och anslutningen kommer från funktionsinställningarna.

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

@FunctionName("getPersonsByPartitionKey")
public Person[] get(
        @HttpTrigger(name = "getPersons", methods = {HttpMethod.GET}, authLevel = AuthorizationLevel.FUNCTION, route="persons/{partitionKey}") HttpRequestMessage<Optional<String>> request,
        @BindingName("partitionKey") String partitionKey,
        @TableInput(name="persons", partitionKey="{partitionKey}", tableName="%MyTableName%", connection="MyConnectionString") Person[] persons,
        final ExecutionContext context) {

    context.getLogger().info("Got query for person related to persons with partition key: " + partitionKey);

    return persons;
}

TableInput-anteckningen kan också extrahera bindningarna från json-brödtexten i begäran, som i följande exempel.

@FunctionName("GetPersonsByKeysFromRequest")
public HttpResponseMessage get(
        @HttpTrigger(name = "getPerson", methods = {HttpMethod.GET}, authLevel = AuthorizationLevel.FUNCTION, route="query") HttpRequestMessage<Optional<String>> request,
        @TableInput(name="persons", partitionKey="{partitionKey}", rowKey = "{rowKey}", tableName="%MyTableName%", connection="MyConnectionString") Person person,
        final ExecutionContext context) {

    if (person == null) {
        return request.createResponseBuilder(HttpStatus.NOT_FOUND)
                    .body("Person not found.")
                    .build();
    }

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

I följande exempel används ett filter för att fråga efter personer med ett specifikt namn i en Azure-tabell och begränsar antalet möjliga matchningar till 10 resultat.

@FunctionName("getPersonsByName")
public Person[] get(
        @HttpTrigger(name = "getPersons", methods = {HttpMethod.GET}, authLevel = AuthorizationLevel.FUNCTION, route="filter/{name}") HttpRequestMessage<Optional<String>> request,
        @BindingName("name") String name,
        @TableInput(name="persons", filter="Name eq '{name}'", take = "10", tableName="%MyTableName%", connection="MyConnectionString") Person[] persons,
        final ExecutionContext context) {

    context.getLogger().info("Got query for person related to persons with name: " + name);

    return persons;
}

I följande exempel visas en tabellindatabindning som använder en köutlösare för att läsa en enskild tabellrad. Bindningen anger en partitionKey och en rowKey. Värdet rowKey {queueTrigger} anger att radnyckeln kommer från kömeddelandesträngen.

import { app, input, InvocationContext } from '@azure/functions';

const tableInput = input.table({
    tableName: 'Person',
    partitionKey: 'Test',
    rowKey: '{queueTrigger}',
    connection: 'MyStorageConnectionAppSetting',
});

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

export async function storageQueueTrigger1(queueItem: unknown, context: InvocationContext): Promise<void> {
    context.log('Node.js queue trigger function processed work item', queueItem);
    const person = <PersonEntity>context.extraInputs.get(tableInput);
    context.log('Person entity name: ' + person.Name);
}

app.storageQueue('storageQueueTrigger1', {
    queueName: 'myqueue-items',
    connection: 'MyStorageConnectionAppSetting',
    extraInputs: [tableInput],
    handler: storageQueueTrigger1,
});
const { app, input } = require('@azure/functions');

const tableInput = input.table({
    tableName: 'Person',
    partitionKey: 'Test',
    rowKey: '{queueTrigger}',
    connection: 'MyStorageConnectionAppSetting',
});

app.storageQueue('storageQueueTrigger1', {
    queueName: 'myqueue-items',
    connection: 'MyStorageConnectionAppSetting',
    extraInputs: [tableInput],
    handler: (queueItem, context) => {
        context.log('Node.js queue trigger function processed work item', queueItem);
        const person = context.extraInputs.get(tableInput);
        context.log('Person entity name: ' + person.Name);
    },
});

Följande funktion använder en köutlösare för att läsa en enskild tabellrad som indata till en funktion.

I det här exemplet anger bindningskonfigurationen ett explicit värde för tabellens partitionKey och använder ett uttryck för att skicka till rowKey. Uttrycket rowKey , {queueTrigger}, anger att radnyckeln kommer från kömeddelandesträngen.

Bindningskonfiguration i function.json:

{
  "bindings": [
    {
      "queueName": "myqueue-items",
      "connection": "MyStorageConnectionAppSetting",
      "name": "MyQueueItem",
      "type": "queueTrigger",
      "direction": "in"
    },
    {
      "name": "PersonEntity",
      "type": "table",
      "tableName": "Person",
      "partitionKey": "Test",
      "rowKey": "{queueTrigger}",
      "connection": "MyStorageConnectionAppSetting",
      "direction": "in"
    }
  ],
  "disabled": false
}

PowerShell-kod i run.ps1:

param($MyQueueItem, $PersonEntity, $TriggerMetadata)
Write-Host "PowerShell queue trigger function processed work item: $MyQueueItem"
Write-Host "Person entity name: $($PersonEntity.Name)"

Följande funktion använder en HTTP-utlösare för att läsa en enskild tabellrad som indata till en funktion.

I det här exemplet anger bindningskonfigurationen ett explicit värde för tabellens partitionKey och använder ett uttryck för att skicka till rowKey. Uttrycket rowKey{id} anger att radnyckeln kommer från den {id} del av vägen i begäran.

Bindningskonfiguration i function.json-filen:

{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "name": "messageJSON",
      "type": "table",
      "tableName": "messages",
      "partitionKey": "message",
      "rowKey": "{id}",
      "connection": "AzureWebJobsStorage",
      "direction": "in"
    },
    {
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "get",
        "post"
      ],
      "route": "messages/{id}"
    },
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    }
  ],
  "disabled": false
}

Python-kod i filen __init__.py :

import json

import azure.functions as func

def main(req: func.HttpRequest, messageJSON) -> func.HttpResponse:

    message = json.loads(messageJSON)
    return func.HttpResponse(f"Table row: {messageJSON}")

Med den här enkla bindningen kan du inte programmatiskt hantera ett ärende där ingen rad som har ett radnyckel-ID hittas. Använd lagrings-SDK för mer detaljerad dataval.


Attribut

C#-bibliotek i både processprocess och isolerad arbetsprocess använder attribut för att definiera funktionen. C#-skriptet använder i stället en function.json konfigurationsfil enligt beskrivningen i C#-skriptguiden.

I C#-klassbibliotek har TableInputAttribute stöd för följande egenskaper:

Attributegenskap beskrivning
TableName Tabellens namn.
PartitionKey Valfritt. Partitionsnyckeln för tabellentiteten som ska läsas.
RowKey Valfritt. Radnyckeln för tabellentiteten som ska läsas.
Ta Valfritt. Det maximala antalet entiteter som ska läsas in i en IEnumerable<T>. Det går inte att använda med RowKey.
Filter Valfritt. Ett OData-filteruttryck för entiteter som ska läsas in i en IEnumerable<T>. Det går inte att använda med RowKey.
Anslutning Namnet på en appinställning eller inställningssamling som anger hur du ansluter till tabelltjänsten. Se Anslut ioner.

Kommentarer

I Java Functions-körningsbiblioteket använder du anteckningen @TableInput för parametrar vars värde skulle komma från Table Storage. Den här anteckningen kan användas med interna Java-typer, POJO:er eller null-värden med hjälp av Optional<T>. Den här kommentaren stöder följande element:

Element Description
Namn Namnet på variabeln som representerar tabellen eller entiteten i funktionskoden.
Tablename Tabellens namn.
partitionKey Valfritt. Partitionsnyckeln för tabellentiteten som ska läsas.
rowKey Valfritt. Radnyckeln för tabellentiteten som ska läsas.
Ta Valfritt. Det maximala antalet entiteter som ska läsas.
filter Valfritt. Ett OData-filteruttryck för tabellindata.
Anslutning Namnet på en appinställning eller inställningssamling som anger hur du ansluter till tabelltjänsten. Se Anslut ioner.

Konfiguration

I följande tabell förklaras de egenskaper som du kan ange för objektet options som skickas input.table() till metoden.

Property beskrivning
Tablename Tabellens namn.
partitionKey Valfritt. Partitionsnyckeln för tabellentiteten som ska läsas.
rowKey Valfritt. Radnyckeln för tabellentiteten som ska läsas. Det går inte att använda med take eller filter.
Ta Valfritt. Det maximala antalet entiteter som ska returneras. Det går inte att använda med rowKey.
filter Valfritt. Ett OData-filteruttryck som entiteterna ska returnera från tabellen. Det går inte att använda med rowKey.
Anslutning Namnet på en appinställning eller inställningssamling som anger hur du ansluter till tabelltjänsten. Se Anslut ioner.

Konfiguration

I följande tabell förklaras de bindningskonfigurationsegenskaper som du anger i filen function.json .

function.json egenskap beskrivning
typ Måste anges till table. Den här egenskapen anges automatiskt när du skapar bindningen i Azure-portalen.
riktning Måste anges till in. Den här egenskapen anges automatiskt när du skapar bindningen i Azure-portalen.
Namn Namnet på variabeln som representerar tabellen eller entiteten i funktionskoden.
Tablename Tabellens namn.
partitionKey Valfritt. Partitionsnyckeln för tabellentiteten som ska läsas.
rowKey Valfritt. Radnyckeln för tabellentiteten som ska läsas. Det går inte att använda med take eller filter.
Ta Valfritt. Det maximala antalet entiteter som ska returneras. Det går inte att använda med rowKey.
filter Valfritt. Ett OData-filteruttryck som entiteterna ska returnera från tabellen. Det går inte att använda med rowKey.
Anslutning Namnet på en appinställning eller inställningssamling som anger hur du ansluter till tabelltjänsten. Se Anslut ioner.

När du utvecklar lokalt lägger du till dina programinställningar i den local.settings.json filen i Values samlingen.

anslutningar

Egenskapen connection är en referens till miljökonfigurationen som anger hur appen ska ansluta till din tabelltjänst. Den kan ange:

Om det konfigurerade värdet både är en exakt matchning för en enskild inställning och en prefixmatchning för andra inställningar används den exakta matchningen.

Connection string

Om du vill hämta en anslutningssträng för tabeller i Azure Table Storage följer du stegen som visas i Hantera åtkomstnycklar för lagringskonton. Om du vill hämta en anslutningssträng för tabeller i Azure Cosmos DB for Table följer du stegen som visas i vanliga frågor och svar om Azure Cosmos DB for Table.

Den här anslutningssträng ska lagras i en programinställning med ett namn som matchar det värde som anges av connection egenskapen för bindningskonfigurationen.

Om namnet på appinställningen börjar med "AzureWebJobs" kan du bara ange resten av namnet här. Om du till exempel anger connection "MyStorage" letar Functions-körningen efter en appinställning med namnet "AzureWebJobsMyStorage". Om du lämnar connection tomt använder Functions-körningen standardinställningen Storage anslutningssträng i appinställningen med namnet AzureWebJobsStorage.

Identitetsbaserade anslutningar

Om du använder api-tillägget Tabeller i stället för att använda en anslutningssträng med en hemlighet kan du låta appen använda en Microsoft Entra-identitet. Detta gäller endast vid åtkomst till tabeller i Azure Storage. Om du vill använda en identitet definierar du inställningar under ett vanligt prefix som mappar till connection egenskapen i utlösar- och bindningskonfigurationen.

Om du anger connection "AzureWebJobsStorage" läser du Anslut som värd för lagring med en identitet. För alla andra anslutningar kräver tillägget följande egenskaper:

Property Miljövariabelmall beskrivning Exempelvärde
Tabelltjänst-URI <CONNECTION_NAME_PREFIX>__tableServiceUri1 Dataplanets URI för Den Azure Storage-tabelltjänst som du ansluter till med hjälp av HTTPS-schemat. <https:// storage_account_name.table.core.windows.net>

1<CONNECTION_NAME_PREFIX>__serviceUri kan användas som ett alias. Om båda formulären tillhandahålls används formuläret tableServiceUri . Formuläret serviceUri kan inte användas när den övergripande anslutningskonfigurationen ska användas mellan blobar, köer och/eller tabeller.

Andra egenskaper kan anges för att anpassa anslutningen. Se Vanliga egenskaper för identitetsbaserade anslutningar.

Formuläret serviceUri kan inte användas när den övergripande anslutningskonfigurationen ska användas mellan blobar, köer och/eller tabeller i Azure Storage. URI:n kan bara ange tabelltjänsten. Alternativt kan du ange en URI specifikt för varje tjänst under samma prefix, vilket gör att en enda anslutning kan användas.

När identitetsbaserade anslutningar finns i Azure Functions-tjänsten använder de en hanterad identitet. Den systemtilldelade identiteten används som standard, även om en användartilldelad identitet kan anges med credential egenskaperna och clientID . Observera att det inte går att konfigurera en användartilldelad identitet med ett resurs-ID. När den körs i andra sammanhang, till exempel lokal utveckling, används utvecklaridentiteten i stället, även om den kan anpassas. Se Lokal utveckling med identitetsbaserade anslutningar.

Bevilja behörighet till identiteten

Den identitet som används måste ha behörighet att utföra de avsedda åtgärderna. För de flesta Azure-tjänster innebär det att du måste tilldela en roll i Azure RBAC med hjälp av antingen inbyggda eller anpassade roller som ger dessa behörigheter.

Viktigt!

Vissa behörigheter kan exponeras av måltjänsten som inte är nödvändiga för alla kontexter. Om möjligt följer du principen om minsta behörighet och beviljar identiteten endast nödvändiga privilegier. Om appen till exempel bara behöver kunna läsa från en datakälla använder du en roll som bara har behörighet att läsa. Det skulle vara olämpligt att tilldela en roll som också tillåter skrivning till tjänsten, eftersom detta skulle vara överdriven behörighet för en läsåtgärd. På samma sätt vill du se till att rolltilldelningen endast är begränsad till de resurser som behöver läsas.

Du måste skapa en rolltilldelning som ger åtkomst till din Azure Storage-tabelltjänst vid körning. Hanteringsroller som Ägare räcker inte. I följande tabell visas inbyggda roller som rekommenderas när du använder Azure Tables-tillägget mot Azure Storage i normal drift. Programmet kan kräva ytterligare behörigheter baserat på den kod du skriver.

Bindningstyp Exempel på inbyggda roller (Azure Storage1)
Indatabindning Dataläsare för lagringstabell
Utdatabindning Storage Table Data-deltagare

1 Om din app i stället ansluter till tabeller i Azure Cosmos DB för tabell stöds inte användning av en identitet och anslutningen måste använda en anslutningssträng.

Användning

Användningen av bindningen beror på versionen av tilläggspaketet och den C#-modalitet som används i funktionsappen, vilket kan vara något av följande:

Ett isolerat arbetsprocessklassbibliotek kompilerade C#-funktioner körs i en process som är isolerad från körningen.

Välj en version för att se användningsinformation för läget och versionen.

När du arbetar med en enskild tabellentitet kan Azure Tables-indatabindningen binda till följande typer:

Typ Beskrivning
En JSON-serialiserbar typ som implementerar ITableEntity Functions försöker deserialisera entiteten till en oformaterad TYP av CLR-objekt (POCO). Typen måste implementera ITableEntity eller ha en strängegenskap RowKey och en strängegenskap PartitionKey .
TableEntity1 Entiteten som en ordlisteliknande typ.

När du arbetar med flera entiteter från en fråga kan Azure Tables-indatabindningen binda till följande typer:

Typ Beskrivning
IEnumerable<T> där T implementerar ITableEntity En uppräkning av entiteter som returneras av frågan. Varje post representerar en entitet. Typen måste implementera ITableEntity eller ha en strängegenskap RowKey och en strängegenskapPartitionKey.T
TableClient1 En klient som är ansluten till tabellen. Detta ger mest kontroll för bearbetning av tabellen och kan användas för att skriva till den om anslutningen har tillräcklig behörighet.

1 Om du vill använda dessa typer måste du referera till Microsoft.Azure.Functions.Worker.Extensions.Tables 1.2.0 eller senare och de vanliga beroendena för SDK-typbindningar.

Attributet TableInput ger dig åtkomst till tabellraden som utlöste funktionen.

Hämta indataraddata med hjälp context.extraInputs.get()av .

Data skickas till indataparametern som anges av name nyckeln i function.json-filen. Om du anger och partitionKeyrowKey kan du filtrera efter specifika poster.

Tabelldata skickas till funktionen som en JSON-sträng. Av-serialisera meddelandet genom att anropa json.loads enligt indataexemplet.

Specifik användningsinformation finns i Exempel.

Nästa steg