Delen via


Verbinding maken Azure Functions naar Azure SQL Database met behulp van Visual Studio Code

Met Azure Functions kunt u Azure-services en andere resource verbinden met services zonder dat u zelf integratiecode moet schrijven. Deze zogenaamde bindingen, die zowel invoer als uitvoer vertegenwoordigen, worden gedeclareerd binnen de functiedefinitie. Gegevens van bindingen worden als parameters doorgegeven aan de functie. Een trigger is een speciaal type invoerbinding. Hoewel een functie slechts één trigger heeft, kan deze meerdere invoer- en uitvoerbindingen hebben. Zie Azure Functions triggers and bindings concepts (Concepten van Azure Functions-triggers en -bindingen) voor meer informatie.

In dit artikel leest u hoe u Visual Studio Code gebruikt om Azure SQL Database te verbinden met de functie die u in het vorige quickstart-artikel hebt gemaakt. De uitvoerbinding die u aan deze functie toevoegt, schrijft gegevens van de HTTP-aanvraag naar een tabel in Azure SQL Database.

Voordat u begint, moet u de quickstart voltooien: Een C#-functie maken in Azure met behulp van Visual Studio Code. Als u de resources na voltooiing van dat artikel al had opgeruimd, doorloopt u de stappen voor het maken van de functie-app en de bijbehorende resources opnieuw in Azure.

Voordat u begint, moet u de quickstart voltooien: Een JavaScript-functie maken in Azure met behulp van Visual Studio Code. Als u de resources na voltooiing van dat artikel al had opgeruimd, doorloopt u de stappen voor het maken van de functie-app en de bijbehorende resources opnieuw in Azure.

Voordat u begint, moet u de quickstart voltooien: Een Python-functie maken in Azure met behulp van Visual Studio Code. Als u de resources na voltooiing van dat artikel al had opgeruimd, doorloopt u de stappen voor het maken van de functie-app en de bijbehorende resources opnieuw in Azure.

Meer informatie over de instellingen voor Azure SQL-bindingen en triggers voor Azure Functions vindt u in de documentatie van Azure Functions.

Een Azure SQL Database maken

  1. Volg de quickstart voor het maken van Azure SQL Database om een serverloze Azure SQL Database te maken. De database kan leeg zijn of worden gemaakt op basis van de voorbeeldgegevensset AdventureWorksLT.

  2. Geef de volgende informatie op bij de prompts:

    Prompt Selectie
    Resourcegroep Kies de resourcegroep waarin u uw functie-app hebt gemaakt in het vorige artikel.
    Databasenaam Voer mySampleDatabase in.
    Servernaam Voer een unieke naam in voor uw server. We kunnen geen exacte servernaam geven die moet worden gebruikt omdat servernamen globaal uniek moeten zijn voor alle servers in Azure en niet alleen uniek moeten zijn binnen een abonnement.
    Verificatiemethode Selecteer SQL Server-verificatie.
    Aanmeldgegevens van serverbeheerder Voer azureuser in.
    Wachtwoord Voer een wachtwoord in dat voldoet aan de complexiteitsvereisten.
    Azure-services en -resources toegang geven tot deze server Selecteer Ja.
  3. Zodra het maken is voltooid, gaat u naar de databaseblade in Azure Portal en selecteert u onder Instellingen Verbinding maken iontekenreeksen. Kopieer de ADO.NET verbindingsreeks voor SQL-verificatie. Plak de verbindingsreeks in een tijdelijk document voor later gebruik.

    Schermopname van het kopiëren van de Azure SQL Database-verbindingsreeks in Azure Portal.

  4. Maak een tabel om de gegevens van de HTTP-aanvraag op te slaan. Navigeer in Azure Portal naar de databaseblade en selecteer Query-editor. Voer de volgende query in om een tabel met de naam dbo.ToDote maken:

    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
    );
    
  5. Controleer of uw Azure-functie toegang heeft tot de Azure SQL Database door de firewallinstellingen van de server te controleren. Navigeer naar de serverblade in Azure Portal en selecteer Onder Beveiliging netwerken. De uitzondering voor Toestaan dat Azure-services en -resources toegang krijgen tot deze server , moet worden gecontroleerd.

    Schermopname van het controleren van de firewallinstellingen van Azure SQL Database in Azure Portal.

De instellingen van uw functie-app bijwerken

In het vorige quickstart-artikel hebt u een functie-app gemaakt in Azure. In dit artikel werkt u uw app bij om gegevens te schrijven naar de Azure SQL Database die u zojuist hebt gemaakt. Als u verbinding wilt maken met uw Azure SQL Database, moet u de bijbehorende verbindingsreeks toevoegen aan uw app-instellingen. Vervolgens downloadt u de nieuwe instelling naar uw local.settings.json-bestand, zodat u verbinding kunt maken met uw Azure SQL Database wanneer u lokaal wordt uitgevoerd.

  1. Bewerk de verbindingsreeks in het tijdelijke document dat u eerder hebt gemaakt. Vervang de waarde van het wachtwoord dat u hebt gebruikt bij het maken van Password de Azure SQL Database. Kopieer de bijgewerkte verbindingsreeks.

  2. Druk op Ctrl/Cmd+shift+P om het opdrachtenpalet te openen en zoek en voer de opdracht Azure Functions: Add New Setting...uit.

  3. Kies de functie-app die u in het vorige artikel hebt gemaakt. Geef de volgende informatie op bij de prompts:

    Prompt Selectie
    Voer de naam van de nieuwe app-instelling in Typ SqlConnectionString.
    Voer de waarde in voor Sql Verbinding maken ionString Plak de verbindingsreeks van uw Azure SQL Database die u zojuist hebt gekopieerd.

    Hiermee maakt u een toepassingsinstelling met de naam verbinding SqlConnectionString in uw functie-app in Azure. U kunt deze instelling nu downloaden naar uw local.settings.json-bestand.

  4. Druk nogmaals op Ctrl/Cmd+shift+P om het opdrachtenpalet te openen en zoek en voer de opdracht Azure Functions: Download Remote Settings...uit.

  5. Kies de functie-app die u in het vorige artikel hebt gemaakt. Selecteer Ja op alle om de bestaande lokale instellingen te overschrijven.

Hiermee downloadt u alle instellingen van Azure naar uw lokale project, inclusief de nieuwe verbindingsreeks-instelling. De meeste gedownloade instellingen worden niet gebruikt wanneer ze lokaal worden uitgevoerd.

Binding-extensies registreren

Omdat u een Azure SQL-uitvoerbinding gebruikt, moet de bijbehorende bindingsextensie zijn geïnstalleerd voordat u het project uitvoert.

Met uitzondering van HTTP- en timertriggers worden bindingen geïmplementeerd als uitbreidingspakketten. Voer de volgende dotnet-pakketopdracht toe in het Terminal-venster om het Azure SQL-extensiepakket toe te voegen aan uw project.

dotnet add package Microsoft.Azure.Functions.Worker.Extensions.Sql

Uw project is geconfigureerd voor het gebruik van uitbreidingsbundels, waarmee automatisch een vooraf gedefinieerde set uitbreidingspakketten wordt geïnstalleerd.

Het gebruik van uitbreidingsbundels wordt ingeschakeld in het bestand host.json in de hoofdmap van het project, dat er als volgt uitziet:

{
  "version": "2.0",
  "logging": {
    "applicationInsights": {
      "samplingSettings": {
        "isEnabled": true,
        "excludedTypes": "Request"
      }
    }
  },
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[4.*, 5.0.0)"
  },
  "concurrency": {
    "dynamicConcurrencyEnabled": true,
    "snapshotPersistenceEnabled": true
  }
}

:::

U kunt nu de Azure SQL-uitvoerbinding toevoegen aan uw project.

Een uitvoerbinding toevoegen

In functies moet voor elk type binding een direction, typeen een unieke name worden gedefinieerd in het bestand function.json. De manier waarop u deze kenmerken definieert, is afhankelijk van de taal van uw functie-app.

Open het HttpExample.cs projectbestand en voeg de volgende ToDoItem klasse toe, waarmee het object wordt gedefinieerd dat naar de database wordt geschreven:

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

In een bibliotheekproject van de C#-klasse worden de bindingen gedefinieerd als bindingseigenschappen in de functiemethode. Het bestand function.json dat wordt vereist door Functions, wordt automatisch gegenereerd op basis van deze kenmerken.

Open het HttpExample.cs projectbestand en voeg de volgende uitvoertypeklasse toe, waarmee de gecombineerde objecten worden gedefinieerd die worden uitgevoerd vanuit onze functie voor zowel het HTTP-antwoord als de SQL-uitvoer:

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

Voeg een using-instructie toe aan de Microsoft.Azure.Functions.Worker.Extensions.Sql bibliotheek boven aan het bestand:

using Microsoft.Azure.Functions.Worker.Extensions.Sql;

Bindingskenmerken worden rechtstreeks in uw code gedefinieerd. In de azure SQL-uitvoerconfiguratie worden de velden beschreven die vereist zijn voor een Azure SQL-uitvoerbinding.

Voor dit MultiResponse scenario moet u een extraOutputs uitvoerbinding toevoegen aan de functie.

app.http('HttpExample', {
  methods: ['GET', 'POST'],
  extraOutputs: [sendToSql],
  handler: async (request, context) => {

Voeg de volgende eigenschappen toe aan de bindingsconfiguratie:

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

Bindingskenmerken worden rechtstreeks in het function_app.py-bestand gedefinieerd. U gebruikt de generic_output_binding decorator om een Azure SQL-uitvoerbinding toe te voegen:

@app.generic_output_binding(arg_name="toDoItems", type="sql", CommandText="dbo.ToDo", ConnectionStringSetting="SqlConnectionString"
    data_type=DataType.STRING)

In deze code arg_name identificeert u de bindingsparameter waarnaar wordt verwezen in uw code, type geeft u aan dat de uitvoerbinding een SQL-uitvoerbinding is, CommandText de tabel waarnaar de binding schrijft en ConnectionStringSetting de naam is van een toepassingsinstelling die de Azure SQL-verbindingsreeks bevat. De verbindingsreeks bevindt zich in de instelling Sql Verbinding maken ionString in het local.settings.json-bestand.

Code toevoegen die gebruikmaakt van de uitvoerbinding

Vervang de bestaande runmethode door de volgende code:

[Function("HttpExample")]
public static OutputType Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req,
    FunctionContext executionContext)
{
    var logger = executionContext.GetLogger("HttpExample");
    logger.LogInformation("C# HTTP trigger function processed a request.");

    var message = "Welcome to Azure Functions!";

    var response = req.CreateResponse(HttpStatusCode.OK);
    response.Headers.Add("Content-Type", "text/plain; charset=utf-8");
    response.WriteString(message);

    // Return a response to both HTTP trigger and Azure SQL output binding.
    return new OutputType()
    {
         ToDoItem = new ToDoItem
        {
            id = System.Guid.NewGuid().ToString(),
            title = message,
            completed = false,
            url = ""
        },
        HttpResponse = response
    };
}

Voeg code toe die gebruikmaakt van het extraInputs uitvoerbindingsobject ingeschakeld context om een JSON-document te verzenden naar de benoemde uitvoerbindingsfunctie. sendToSql Voeg deze code toe vóór de instructie return.

const data = JSON.stringify([
  {
    // create a random ID
    Id: crypto.randomUUID(),
    title: name,
    completed: false,
    url: '',
  },
]);

// Output to Database
context.extraOutputs.set(sendToSql, data);

Als u de crypto module wilt gebruiken, voegt u de volgende regel toe aan het begin van het bestand:

const crypto = require("crypto");

Op dit moment moet uw functie er als volgt uit zien:

const { app, output } = require('@azure/functions');
const crypto = require('crypto');

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

app.http('HttpExample', {
  methods: ['GET', 'POST'],
  extraOutputs: [sendToSql],
  handler: async (request, context) => {
    try {
      context.log(`Http function processed request for url "${request.url}"`);

      const name = request.query.get('name') || (await request.text());

      if (!name) {
        return { status: 404, body: 'Missing required data' };
      }

      // Stringified array of objects to be inserted into the database
      const data = JSON.stringify([
        {
          // create a random ID
          Id: crypto.randomUUID(),
          title: name,
          completed: false,
          url: '',
        },
      ]);

      // Output to Database
      context.extraOutputs.set(sendToSql, data);

      const responseMessage = name
        ? 'Hello, ' +
          name +
          '. This HTTP triggered function executed successfully.'
        : 'This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response.';

      // Return to HTTP client
      return { body: responseMessage };
    } catch (error) {
      context.log(`Error: ${error}`);
      return { status: 500, body: 'Internal Server Error' };
    }
  },
});

Werk HttpExample\function_app.py bij zodat deze overeenkomt met de volgende code. Voeg de toDoItems parameter toe aan de functiedefinitie en toDoItems.set() onder de if name: instructie:

import azure.functions as func
import logging
from azure.functions.decorators.core import DataType
import uuid

app = func.FunctionApp()

@app.function_name(name="HttpTrigger1")
@app.route(route="hello", auth_level=func.AuthLevel.ANONYMOUS)
@app.generic_output_binding(arg_name="toDoItems", type="sql", CommandText="dbo.ToDo", ConnectionStringSetting="SqlConnectionString",data_type=DataType.STRING)
def test_function(req: func.HttpRequest, toDoItems: func.Out[func.SqlRow]) -> func.HttpResponse:
     logging.info('Python HTTP trigger function processed a request.')
     name = req.get_json().get('name')
     if not name:
        try:
            req_body = req.get_json()
        except ValueError:
            pass
        else:
            name = req_body.get('name')

     if name:
        toDoItems.set(func.SqlRow({"Id": str(uuid.uuid4()), "title": name, "completed": False, "url": ""}))
        return func.HttpResponse(f"Hello {name}!")
     else:
        return func.HttpResponse(
                    "Please pass a name on the query string or in the request body",
                    status_code=400
                )

De functie lokaal uitvoeren

Visual Studio Code integreert met Azure Functions Core Tools om u een project te laten uitvoeren vanaf uw lokale ontwikkelaarscomputer voordat u in Azure publiceert. Als u Core Tools nog niet lokaal hebt geïnstalleerd, wordt u gevraagd deze te installeren wanneer u uw project voor het eerst uitvoert.

  1. Druk op F5 om het functie-app-project te starten en uw functie aan te roepen. In het terminalvenster wordt de uitvoer van Core Tools weergegeven. Uw app wordt gestart in het deelvenster Terminal . Kopieer het URL-eindpunt van uw functie die lokaal wordt uitgevoerd en door HTTP is geactiveerd.

    Schermopname van de Visual Studio Code-uitvoer van de lokale functie.

    Als u Core Tools nog niet hebt geïnstalleerd, selecteert u Installeren om Core Tools te installeren wanneer u hierom wordt gevraagd.
    Als u problemen ondervindt met het uitvoeren op Windows, moet u ervoor zorgen dat de standaardterminal voor Visual Studio Code niet is ingesteld op WSL Bash.

  2. Wanneer de Core Tools worden uitgevoerd, gaat u naar het gebied Azure: Functions . Vouw onder Functions lokaal projectfuncties> uit. Klik met de rechtermuisknop (Windows) of Ctrl - klik op de HttpExample functie (macOS) en kies Nu functie uitvoeren....

    Schermopname van de functie nu uitvoeren vanuit Visual Studio Code.

  3. Druk in de hoofdtekst van de Enter-aanvraag op Enter om een aanvraagbericht naar uw functie te verzenden.

  4. Wanneer de functie lokaal wordt uitgevoerd en een antwoord retourneert, wordt er een melding gegenereerd in Visual Studio Code. Informatie over de uitvoering van de functie wordt weergegeven in het deelvenster Terminal .

  5. Druk op CTRL + C om Core Tools te stoppen en de verbinding met het foutopsporingsprogramma te verbreken.

De functie lokaal uitvoeren

  1. Net als in het vorige artikel drukt u op F5 om het functie-app-project en Core Tools te starten.

  2. Als Core Tools worden uitgevoerd, gaat u naar het gebied Azure: Functions . Vouw onder Functions lokaal projectfuncties> uit. Klik met de rechtermuisknop op de HttpExample functie (Ctrl-klik op Mac) en kies Nu functie uitvoeren....

    Schermopname van het menu-item Nu van de functie uitvoeren vanuit Visual Studio Code.

  3. In de hoofdtekst van de aanvraag wordt de hoofdtekstwaarde van het aanvraagbericht weergegeven.{ "name": "Azure" } Druk op Enter om dit aanvraagbericht naar uw functie te verzenden.

  4. Nadat een antwoord is geretourneerd, drukt u op Ctrl+C om Core Tools te stoppen.

Controleer of er gegevens naar de database zijn geschreven

  1. Ga in Azure Portal terug naar uw Azure SQL Database en selecteer Query-editor.

    Schermopname van aanmelden bij query-editor in Azure Portal.

  2. Verbinding maken naar uw database en vouw de Het knooppunt Tabellen in objectverkenner aan de linkerkant. Klik met de rechtermuisknop op de dbo.ToDo tabel en selecteer Top 1000 Rijen selecteren.

  3. Controleer of de nieuwe informatie door de uitvoerbinding naar de database is geschreven.

De bijgewerkte app opnieuw implementeren en verifiëren

  1. Druk in Visual Studio Code op F1 om het opdrachtenpalet te openen. In het opdrachtenpalet zoekt en selecteert u Azure Functions: Deploy to function app....

  2. Kies de functie-app die u in het eerste artikel hebt gemaakt. Omdat u uw project opnieuw implementeert voor dezelfde app, selecteert u Implementeren om de waarschuwing over het overschrijven van bestanden te negeren.

  3. Nadat de implementatie is voltooid, kunt u de functie Nu uitvoeren gebruiken... om de functie in Azure te activeren.

  4. Controleer opnieuw de gegevens die naar uw Azure SQL Database zijn geschreven om te controleren of de uitvoerbinding opnieuw een nieuw JSON-document genereert.

Resources opschonen

In Azure verwijzen Resources naar functie-apps, functies, opslagaccounts enzovoort. Deze zijn gegroepeerd in resourcegroepen. U kunt alle resources in een groep verwijderen door de groep zelf te verwijderen.

U hebt resources gemaakt om deze snelstartgidsen te voltooien. Deze resources kunnen bij u in rekening worden gebracht, afhankelijk van de accountstatus en serviceprijzen. Als u de resources niet meer nodig hebt, kunt u ze als volgt verwijderen:

  1. Druk in Visual Studio Code op F1 om het opdrachtenpalet te openen. In het opdrachtenpalet zoekt en selecteert u Azure: Open in portal.

  2. Kies uw functie-app en druk op Enter. De functie-app wordt geopend in de Azure-portal.

  3. Selecteer op het tabblad Overzicht de benoemde koppeling naast Resourcegroep.

    Schermopname van het selecteren van de resourcegroep die u wilt verwijderen van de pagina van de functie-app.

  4. Controleer op de pagina Resourcegroep de lijst met opgenomen resources en controleer of ze de resources zijn die u wilt verwijderen.

  5. Selecteer Resourcegroep verwijderen en volg de instructies.

    Verwijderen kan enkele minuten duren. Wanneer dit is voltooid, verschijnt een aantal seconden een melding in beeld. U kunt ook het belpictogram bovenaan de pagina selecteren om de melding te bekijken.

Volgende stappen

U hebt uw door HTTP geactiveerde functie bijgewerkt om gegevens naar Azure SQL Database te schrijven. Nu kunt u meer informatie vinden over het ontwikkelen van functies met Visual Studio Code: