Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Usare l'associazione di input tabelle di Azure per leggere una tabella in Azure Cosmos DB per Tabelle o Archiviazione tabelle di Azure.
Per informazioni sui dettagli di impostazione e configurazione, vedere la panoramica.
Importante
Questo articolo usa schede per supportare le versioni diverse del modello di programmazione Node.js. Il modello v4 è disponibile a livello generale ed è progettato per offrire un'esperienza più flessibile e intuitiva per gli sviluppatori JavaScript e TypeScript. Per altre informazioni sul funzionamento del modello v4, vedere la guida per gli sviluppatori di Node.js per Funzioni di Azure. Altre informazioni sulle differenze tra i modelli v3 e v4 sono disponibili nella guida alla migrazione.
Esempio
Il supporto Go non è attualmente disponibile per questo binding.
L'utilizzo dell'associazione dipende dalla versione del pacchetto di estensione e dalla modalità C# usata nell'app per le funzioni, che può essere una delle seguenti:
Una libreria di classi di processo di lavoro isolata compilata C# viene eseguita in un processo isolato dal runtime.
Scegliere una versione per visualizzare esempi per la modalità e la versione.
La classe seguente MyTableData rappresenta una riga di dati nella tabella:
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; }
}
La funzione seguente, avviata da un trigger di archiviazione code, legge una chiave di riga dalla coda, che viene usata per ottenere la riga dalla tabella di input. L'espressione {queueTrigger} associa la chiave di riga ai metadati del messaggio, ovvero la stringa del messaggio.
[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}"
};
}
La funzione attivata dalla coda seguente restituisce le prime 5 entità come IEnumerable<T>, con il valore della chiave di partizione impostato come messaggio della coda.
[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}");
}
}
Le Filter proprietà e Take vengono usate per limitare il numero di entità restituite.
Nell'esempio seguente viene illustrata una funzione attivata da HTTP che restituisce un elenco di oggetti persona che si trovano in una partizione specificata nell'archiviazione tabelle. Nell'esempio la chiave di partizione viene estratta dalla route HTTP e tableName e la connessione provengono dalle impostazioni della funzione.
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;
}
L'annotazione TableInput può anche estrarre le associazioni dal corpo json della richiesta, come illustrato nell'esempio seguente.
@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();
}
L'esempio seguente usa un filtro per eseguire una query per le persone con un nome specifico in una tabella di Azure e limita il numero di corrispondenze possibili a 10 risultati.
@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;
}
Nell'esempio seguente viene illustrata un'associazione di input di tabella che usa un trigger della coda per leggere una singola riga di tabella. L'associazione specifica un partitionKey oggetto e un oggetto rowKey. Il valore rowKey "{queueTrigger}" indica che la chiave della riga proviene dalla stringa di messaggio della coda.
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);
},
});
La funzione seguente usa un trigger della coda per leggere una singola riga di tabella come input in una funzione.
In questo esempio, la configurazione dell'associazione specifica un valore esplicito per la tabella e usa un'espressione partitionKey per passare all'oggetto rowKey. L'espressione rowKey , {queueTrigger}, indica che la chiave di riga proviene dalla stringa del messaggio della coda.
Configurazione dell'associazione in 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
}
Codice di PowerShell in run.ps1:
param($MyQueueItem, $PersonEntity, $TriggerMetadata)
Write-Host "PowerShell queue trigger function processed work item: $MyQueueItem"
Write-Host "Person entity name: $($PersonEntity.Name)"
La funzione seguente usa un trigger HTTP per leggere una singola riga di tabella come input in una funzione.
In questo esempio, la configurazione dell'associazione specifica un valore esplicito per la tabella e usa un'espressione partitionKey per passare all'oggetto rowKey. L'espressione rowKey indica {id} che la chiave di riga proviene dalla {id} parte della route nella richiesta.
import json
import azure.functions as func
app = func.FunctionApp()
@app.route(route="messages/{id}")
@app.table_input(arg_name="messageJSON",
connection="AzureWebJobsStorage",
table_name="messages",
row_key='{id}',
partition_key="message")
def table_in_binding(req: func.HttpRequest, messageJSON):
message = json.loads(messageJSON)
return func.HttpResponse(f"Table row: {messageJSON}")
Con questa semplice associazione, non è possibile gestire a livello di codice un caso in cui non viene trovata alcuna riga con ID chiave di riga. Per una selezione più dettagliata dei dati, usare l'SDK di archiviazione.
Attributi
Sia le librerie C# in-process che il processo di lavoro isolato usano attributi per definire la funzione. Lo script C# usa invece un file di configurazione function.json come descritto nella guida per gli script C#.
Nelle librerie diTableInputAttribute classi C# supporta le proprietà seguenti:
| Proprietà dell'attributo | Descrizione |
|---|---|
| Nome della tabella | Nome della tabella. |
| PartitionKey | Facoltativo. Chiave di partizione dell'entità della tabella da leggere. |
| RowKey | Facoltativo. Chiave di riga dell'entità della tabella da leggere. |
| Prendere | Facoltativo. Numero massimo di entità da leggere in un oggetto IEnumerable<T>. Non può essere usato con RowKey. |
| Filtra | Facoltativo. Espressione di filtro OData per le entità da leggere in un oggetto IEnumerable<T>. Non può essere usato con RowKey. |
| Connessione | Nome di un'impostazione o di una raccolta di impostazioni dell'app che specifica come connettersi al servizio tabelle. Vedere Connessioni. |
Annotazioni
Nella libreria di runtime di funzioni Java, usare @TableInput l'annotazione per i parametri il cui valore deriva dall’archiviazione tabelle. Questa annotazione è utilizzabile con i tipi Java nativi, con oggetti POJO o con valori nullable tramite Optional<T>. Questa annotazione supporta gli elementi seguenti:
| Elemento | Descrizione |
|---|---|
| nome | Nome della variabile che rappresenta la tabella o l'entità nel codice della funzione. |
| tableName | Nome della tabella. |
| partitionKey | Facoltativo. Chiave di partizione dell'entità della tabella da leggere. |
| rowKey | Facoltativo. Chiave di riga dell'entità della tabella da leggere. |
| prendere | Facoltativo. Numero massimo di entità da leggere. |
| filtro | Facoltativo. Espressione di filtro OData per l'input della tabella. |
| connessione | Nome di un'impostazione o di una raccolta di impostazioni dell'app che specifica come connettersi al servizio tabelle. Vedere Connessioni. |
Impostazione
Nella tabella seguente vengono illustrate le proprietà che è possibile impostare sull'oggetto options passato al input.table() metodo .
| Proprietà | Descrizione |
|---|---|
| tableName | Nome della tabella. |
| partitionKey | Facoltativo. Chiave di partizione dell'entità della tabella da leggere. |
| rowKey | Facoltativo. Chiave di riga dell'entità della tabella da leggere. Non può essere usata con take o filter. |
| prendere | Facoltativo. Numero massimo di entità da restituire. Non può essere usato con rowKey. |
| filtro | Facoltativo. Espressione di filtro OData per le entità da restituire dalla tabella. Non può essere usato con rowKey. |
| connessione | Nome di un'impostazione o di una raccolta di impostazioni dell'app che specifica come connettersi al servizio tabelle. Vedere Connessioni. |
Impostazione
Nella tabella seguente sono illustrate le proprietà di configurazione dell'associazione impostate nel file function.json.
| Proprietà di function.json | Descrizione |
|---|---|
| tipo | Deve essere impostato su table. Questa proprietà viene impostata automaticamente quando si crea l'associazione nel portale di Azure. |
| direzione | Deve essere impostato su in. Questa proprietà viene impostata automaticamente quando si crea l'associazione nel portale di Azure. |
| nome | Nome della variabile che rappresenta la tabella o l'entità nel codice della funzione. |
| tableName | Nome della tabella. |
| partitionKey | Facoltativo. Chiave di partizione dell'entità della tabella da leggere. |
| rowKey | Facoltativo. Chiave di riga dell'entità della tabella da leggere. Non può essere usata con take o filter. |
| prendere | Facoltativo. Numero massimo di entità da restituire. Non può essere usato con rowKey. |
| filtro | Facoltativo. Espressione di filtro OData per le entità da restituire dalla tabella. Non può essere usato con rowKey. |
| connessione | Nome di un'impostazione o di una raccolta di impostazioni dell'app che specifica come connettersi al servizio tabelle. Vedere Connessioni. |
Quando si sviluppa in locale, aggiungere le impostazioni dell'applicazione nel file local.settings.json nella Values raccolta.
Connessioni
La connection proprietà è impostata come chiave nelle impostazioni dell'applicazione che restituisce un valore usato dal runtime Functions per collegarsi all'account di archiviazione usato dall'estensione. Il valore dell'impostazione della proprietà di connessione dipende dal tipo di connessione:
-
Connessione di identità gestita: La
connectionproprietà è<CONNECTION_NAME_PREFIX>condivisa da un gruppo di impostazioni che insieme definiscono una connessione basata sull'identità con l'account di archiviazione. Per ulteriori informazioni, vedi Definire connessioni identitari. -
Riferimento Key Vault: L'impostazione
connectionproprietà restituisce un riferimento Azure Key Vault alla posizione in cui la stringa di connessione è mantenuta centralmente. Per maggiori informazioni, vedi Definire le connessioni Key Vault. -
Riferimento App Configuration: L'impostazione
connectionproprietà restituisce un riferimento Configurazione app di Azure che restituisce una stringa di connessione o un riferimento a Key Vault. Per ulteriori informazioni, consulta Configurazione app di Azure nell'articolo sulle connessioni. -
Connection string: L'impostazione
connectionproprietà restituisce la stringa di connessione effettiva dell'account di storage. Poiché la stringa di connessione contiene chiavi segrete condivise, dovresti considerare l'uso di una connessione di identità gestita, quando possibile. Per maggiori informazioni, vedi Definisci le connessioni.
Per saperne di più sulle connessioni dei binding, consulta Gestire la connessione in Funzioni di Azure. Per ottenere un stringa di connessione, seguire la procedura illustrata in Gestire le chiavi di accesso dell'account di archiviazione.
Quando imposti connection una chiave o un prefisso di chiave chiamato AzureWebJobsStorage o una stringa vuota, l'estensione di binding utilizza l'account di memoria host predefinito. Per maggiori informazioni, vedi Ottimizza le prestazioni di archiviazione.
Utilizzo
L'utilizzo dell'associazione dipende dalla versione del pacchetto di estensione e dalla modalità C# usata nell'app per le funzioni, che può essere una delle seguenti:
Una funzione C# compilata di libreria di classi di processo di lavoro viene eseguita in un processo isolato dal runtime.
Scegliere una versione per visualizzare i dettagli di utilizzo per la modalità e la versione.
Quando si usa una singola entità di tabella, l'associazione di input tabelle di Azure può essere associata ai tipi seguenti:
| Tipo | Descrizione |
|---|---|
| Tipo serializzabile JSON che implementa ITableEntity | Funzioni tenta di deserializzare l'entità in un tipo POCO (Plain-Old CLR Object). Il tipo deve implementare ITableEntity o avere una proprietà stringa RowKey e una proprietà stringa PartitionKey . |
| TableEntity1 | Entità come tipo di dizionario. |
Quando si usano più entità da una query, l'associazione di input tabelle di Azure può essere associata ai tipi seguenti:
| Tipo | Descrizione |
|---|---|
IEnumerable<T> dove T implementa ITableEntity |
Enumerazione delle entità restituite dalla query. Ogni voce rappresenta un'entità. Il tipo T deve implementare ITableEntity o avere una proprietà stringa RowKey e una proprietà stringa PartitionKey . |
| TableClient1 | Un client connesso alla tabella. Ciò offre il controllo più importante per l'elaborazione della tabella e può essere usato per scrivervi se la connessione dispone di autorizzazioni sufficienti. |
1 Per usare questi tipi, è necessario fare riferimento a Microsoft.Azure.Functions.Worker.Extensions.Tables 1.2.0 o versioni successive e alle dipendenze comuni per le associazioni di tipi SDK.
L'attributo TableInput consente di accedere alla riga della tabella che ha attivato la funzione.
Ottenere i dati delle righe di input usando context.extraInputs.get().
I dati vengono passati al parametro di input come specificato dalla name chiave nel file function.json . Specificando The partitionKey e rowKey è possibile filtrare in base a record specifici.
I dati della tabella vengono passati alla funzione come stringa JSON. De-serializzare il messaggio chiamando json.loads come illustrato nell'esempio di input.
Per informazioni dettagliate sull'utilizzo, vedere Esempio.