Compartilhar via


Associação de saída do Banco de Dados do Azure para MySQL para o Azure Functions

Você pode usar a associação de saída do Banco de Dados do Azure para MySQL para gravar em um banco de dados.

Para obter informações sobre configuração e configuração, consulte a visão geral.

Importante

Este artigo usa guias para dar suporte a várias versões do modelo de programação Node.js. O modelo v4 normalmente está disponível e foi projetado para oferecer uma experiência mais flexível e intuitiva para desenvolvedores de JavaScript e TypeScript. Para obter mais detalhes sobre como funciona o modelo v4, consulte o Guia do desenvolvedor do Node.js para o Azure Functions. Para conhecer as diferenças entre a v3 e a v4, consulte o Guia de migração.

Exemplos

Você pode criar uma função C# usando um dos seguintes modos C#:

  • Modelo de trabalho isolado: função C# compilada executada em um processo de trabalho que está isolado do runtime. Um processo de trabalho isolado é necessário para dar suporte a funções C# em execução em LTS (suporte de longo prazo) e versões não LTS para .NET e .NET Framework.
  • Modelo em processo: função C# compilada que é executada no mesmo processo que o runtime do Azure Functions.
  • Script C#: usado principalmente ao criar funções C# no portal do Azure.

Mais exemplos para a associação de saída do Banco de Dados do Azure para MySQL estão disponíveis no repositório GitHub.

Esta seção contém o seguinte exemplo:

O exemplo refere-se a uma classe Product e a uma tabela de banco de dados correspondente:

namespace AzureMySqlSamples.Common
{
    public class Product
    {
        public int? ProductId { get; set; }

        public string Name { get; set; }

        public int Cost { get; set; }

        public override bool Equals(object obj)
    }
}
DROP TABLE IF EXISTS Products;

CREATE TABLE Products (
  ProductId int PRIMARY KEY,
  Name varchar(100) NULL,
  Cost int NULL
);

Gatilho HTTP, gravar um registro

O exemplo a seguir mostra uma função C# que adiciona um registro a um banco de dados usando dados fornecidos em uma solicitação HTTP POST como um corpo JSON.

using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Extensions.MySql;
using Microsoft.Azure.Functions.Worker.Http;
using AzureMySqlSamples.Common;

namespace AzureMySqlSamples.OutputBindingSamples
{
    public static class AddProduct
    {
        [FunctionName(nameof(AddProduct))]
        public static IActionResult Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "addproduct")]
            [FromBody] Product prod,
            [MySql("Products", "MySqlConnectionString")] out Product product)
        {
            product = prod;
            return new CreatedResult($"/api/addproduct", product);
        }
    }
}

Mais exemplos para a associação de saída do Banco de Dados do Azure para MySQL estão disponíveis no repositório GitHub.

Esta seção contém o seguinte exemplo:

O exemplo refere-se a uma classe Product e a uma tabela de banco de dados correspondente:

package com.function.Common;

import com.fasterxml.jackson.annotation.JsonProperty;

public class Product {
    @JsonProperty("ProductId")
    private int ProductId;
    @JsonProperty("Name")
    private String Name;
    @JsonProperty("Cost")
    private int Cost;

    public Product() {
    }

    public Product(int productId, String name, int cost) {
        ProductId = productId;
        Name = name;
        Cost = cost;
    }
}
DROP TABLE IF EXISTS Products;

CREATE TABLE Products (
  ProductId int PRIMARY KEY,
  Name varchar(100) NULL,
  Cost int NULL
);

Gatilho HTTP, gravar um registro em uma tabela

O exemplo a seguir mostra uma associação de saída do Banco de Dados do Azure para MySQL em uma função Java que adiciona um registro a uma tabela usando dados fornecidos em uma solicitação HTTP POST como um corpo JSON. A função usa uma dependência adicional da biblioteca com.google.code.gson para analisar o corpo JSON.

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

import com.microsoft.azure.functions.HttpMethod;
import com.microsoft.azure.functions.HttpRequestMessage;
import com.microsoft.azure.functions.HttpResponseMessage;
import com.microsoft.azure.functions.HttpStatus;
import com.microsoft.azure.functions.OutputBinding;
import com.microsoft.azure.functions.annotation.AuthorizationLevel;
import com.microsoft.azure.functions.annotation.FunctionName;
import com.microsoft.azure.functions.annotation.HttpTrigger;
import com.microsoft.azure.functions.mysql.annotation.MySqlOutput;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.function.Common.Product;

import java.io.IOException;
import java.util.Optional;

public class AddProduct {
    @FunctionName("AddProduct")
    public HttpResponseMessage run(
            @HttpTrigger(
                name = "req",
                methods = {HttpMethod.POST},
                authLevel = AuthorizationLevel.ANONYMOUS,
                route = "addproduct")
                HttpRequestMessage<Optional<String>> request,
            @MySqlOutput(
                name = "product",
                commandText = "Products",
                connectionStringSetting = "MySqlConnectionString")
                OutputBinding<Product> product) throws JsonParseException, JsonMappingException, IOException {

        String json = request.getBody().get();
        ObjectMapper mapper = new ObjectMapper();
        Product p = mapper.readValue(json, Product.class);
        product.setValue(p);

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

Mais exemplos para a associação de saída do Banco de Dados do Azure para MySQL estão disponíveis no repositório GitHub.

Esta seção contém o seguinte exemplo:

O exemplo refere-se a uma tabela de banco de dados:

DROP TABLE IF EXISTS Products;

CREATE TABLE Products (
  ProductId int PRIMARY KEY,
  Name varchar(100) NULL,
  Cost int NULL
);

Gatilho HTTP, gravar registros em uma tabela

O exemplo a seguir mostra uma associação de saída do Banco de Dados do Azure para MySQL que adiciona registros a uma tabela usando dados fornecidos em uma solicitação HTTP POST como um corpo JSON.

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

const mysqlOutput = output.generic({
    type: 'mysql',
    commandText: 'Products',
    connectionStringSetting: 'MySqlConnectionString'
})

// Upsert the product, which will insert it into the Products table if the primary key (ProductId) for that item doesn't exist.
// If it does, update it to have the new name and cost.
app.http('AddProduct', {
    methods: ['POST'],
    authLevel: 'anonymous',
    extraOutputs: [mysqlOutput],
    handler: async (request, context) => {
        // Note that this expects the body to be a JSON object or array of objects that have a property
        // matching each of the columns in the table to upsert to.
        const product = await request.json();
        context.extraOutputs.set(mysqlOutput, product);

        return {
            status: 201,
            body: JSON.stringify(product)
        };
    }
});
const { app, output } = require('@azure/functions');

const mysqlOutput = output.generic({
    type: 'mysql',
    commandText: 'Products',
    connectionStringSetting: 'MySqlConnectionString'
})

// Upsert the product, which will insert it into the Products table if the primary key (ProductId) for that item doesn't exist.
// If it does, update it to have the new name and cost.
app.http('AddProduct', {
    methods: ['POST'],
    authLevel: 'anonymous',
    extraOutputs: [mysqlOutput],
    handler: async (request, context) => {
        // Note that this expects the body to be a JSON object or array of objects that have a property
        // matching each of the columns in the table to upsert to.
        const product = await request.json();
        context.extraOutputs.set(mysqlOutput, product);

        return {
            status: 201,
            body: JSON.stringify(product)
        };
    }
});

Mais exemplos para a associação de saída do Banco de Dados do Azure para MySQL estão disponíveis no repositório GitHub.

Esta seção contém o seguinte exemplo:

O exemplo refere-se a uma tabela de banco de dados:

DROP TABLE IF EXISTS Products;

CREATE TABLE Products (
  ProductId int PRIMARY KEY,
  Name varchar(100) NULL,
  Cost int NULL
);

Gatilho HTTP, gravar registros em uma tabela

O exemplo a seguir mostra uma associação de saída do Banco de Dados do Azure para MySQL em um arquivo function.json e uma função do PowerShell que adiciona registros a uma tabela usando dados fornecidos em uma solicitação HTTP POST como um corpo JSON.

Veja a seguir o exemplo da associação de dados no arquivo function.json:

{
  "bindings": [
    {
      "authLevel": "function",
      "name": "Request",
      "direction": "in",
      "type": "httpTrigger",
      "methods": [
        "post"
      ],
      "route": "addproduct"
    },
    {
      "name": "response",
      "type": "http",
      "direction": "out"
    },
    {
      "name": "product",
      "type": "mysql",
      "direction": "out",
      "commandText": "Products",
      "connectionStringSetting": "MySqlConnectionString"
    }
  ],
  "disabled": false
}

A seção Configuração explica essas propriedades.

O exemplo a seguir é o código do PowerShell de exemplo para a função no arquivo run.ps1:

using namespace System.Net

# Trigger binding data passed in via parameter block.
param($Request, $TriggerMetadata)

# Write to the Azure Functions log stream.
Write-Host "PowerShell function with MySql Output Binding processed a request."

# Note that this expects the body to be a JSON object or array of objects 
# that have a property matching each of the columns in the table to upsert to.
$req_body = $Request.Body

# Assign the value that you want to pass to the MySQL output binding. 
# The -Name value corresponds to the name property in the function.json file for the binding.
Push-OutputBinding -Name product -Value $req_body

# Assign the value to return as the HTTP response. 
# The -Name value matches the name property in the function.json file for the binding.
Push-OutputBinding -Name response -Value ([HttpResponseContext]@{
    StatusCode = [HttpStatusCode]::OK
    Body = $req_body
})

Mais exemplos para a associação de saída do Banco de Dados do Azure para MySQL estão disponíveis no repositório GitHub.

Esta seção contém o seguinte exemplo:

O exemplo refere-se a uma tabela de banco de dados:

DROP TABLE IF EXISTS Products;

CREATE TABLE Products (
  ProductId int PRIMARY KEY,
  Name varchar(100) NULL,
  Cost int NULL
);

Observação

Você deve usar o Azure Functions versão 1.22.0b4 para Python.

Gatilho HTTP, gravar registros em uma tabela

O exemplo a seguir mostra uma associação de saída do Banco de Dados do Azure para MySQL em um arquivo function.json e uma função Python que adiciona registros a uma tabela usando dados fornecidos em uma solicitação HTTP POST como um corpo JSON.

O exemplo a seguir é o código Python de exemplo para o arquivo function_app.py:

import json 

import azure.functions as func

app = func.FunctionApp(http_auth_level=func.AuthLevel.ANONYMOUS)
@app.generic_trigger(arg_name="req", type="httpTrigger", route="addproduct")
@app.generic_output_binding(arg_name="$return", type="http")
@app.generic_output_binding(arg_name="r", type="mysql",
                            command_text="Products",
                            connection_string_setting="MySqlConnectionString")
def mysql_output(req: func.HttpRequest, r: func.Out[func.MySqlRow]) \
        -> func.HttpResponse:
    body = json.loads(req.get_body())
    row = func.MySqlRow.from_dict(body)
    r.set(row)

    return func.HttpResponse(
        body=req.get_body(),
        status_code=201,
        mimetype="application/json"
    )

Atributos

A biblioteca C# usa o MySqlAttribute atributo para declarar as associações MySQL na função, que tem as seguintes propriedades:

Propriedade de atributo Descrição
CommandText Obrigatórios. O nome da tabela na qual a associação grava.
ConnectionStringSetting Obrigatórios. O nome de uma configuração de aplicativo que contém a cadeia de conexão do banco de dados ao qual os dados são gravados. Esse valor não é a cadeia de conexão real e, em vez disso, deve ser resolvido para uma variável de ambiente.

Anotações

Na biblioteca de runtime de funções Java, use a @MySQLOutput anotação em parâmetros cujo valor viria do Banco de Dados do Azure para MySQL. Essa anotação dá suporte aos seguintes elementos:

Elemento Descrição
commandText Obrigatórios. O nome da tabela na qual a associação grava.
connectionStringSetting Obrigatórios. O nome de uma configuração de aplicativo que contém a cadeia de conexão do banco de dados ao qual os dados são gravados. Esse valor não é a cadeia de conexão real e, em vez disso, deve ser resolvido para uma variável de ambiente.
name Obrigatórios. O nome exclusivo da associação de função.

Configuração

A tabela a seguir explica as propriedades que você pode definir no options objeto passado para o output.generic() método:

Propriedade Descrição
commandText Obrigatórios. O nome da tabela na qual a associação grava.
connectionStringSetting Obrigatórios. O nome de uma configuração de aplicativo que contém a cadeia de conexão do banco de dados ao qual os dados são gravados. Esse valor não é a cadeia de conexão real e, em vez disso, deve ser resolvido para uma variável de ambiente.

Configuração

A tabela a seguir explica as propriedades de configuração de associação que você definiu no arquivo function.json:

Propriedade Descrição
type Obrigatórios. Deve ser definido como Mysql.
direction Obrigatórios. Deve ser definido como out.
name Obrigatórios. O nome da variável que representa a entidade no código da função.
commandText Obrigatórios. O nome da tabela na qual a associação grava.
connectionStringSetting Obrigatórios. O nome de uma configuração de aplicativo que contém a cadeia de conexão do banco de dados ao qual os dados são gravados. Esse valor não é a cadeia de conexão real e, em vez disso, deve ser resolvido para uma variável de ambiente.

Quando você estiver desenvolvendo localmente, adicione as configurações do aplicativo no arquivo local.settings.json na coleção Values.

Observação

A associação de saída dá suporte a todos os caracteres especiais, incluindo sinal de dólar ($), backtick ('), hífen (-) e sublinhado (_). Para obter mais informações, consulte a documentação da comunidade MySQL.

Uma linguagem de programação pode definir atributos de membro que contêm caracteres especiais compatíveis. Por exemplo, o C# tem algumas limitações para definir variáveis.

Caso contrário, você poderá usar JObject para a associação de saída que abrange todos os caracteres especiais. Você pode seguir um exemplo detalhado no GitHub.

Uso

A CommandText propriedade é o nome da tabela em que os dados são armazenados. O nome da configuração da cadeia de conexão corresponde à configuração do aplicativo que contém a cadeia de conexão com o Banco de Dados do Azure para MySQL.

Se ocorrer uma exceção quando uma associação de entrada MySQL for executada, o código da função não será executado. O resultado pode ser um código de erro, como um gatilho HTTP que retorna um código de erro 500.