Compartir a través de


Enlace de salida de Azure Database for MySQL para Azure Functions

Puede usar el enlace de salida de Azure Database for MySQL para escribir en una base de datos.

Para obtener información sobre la configuración y la configuración, consulte la información general.

Importante

En este artículo se usan pestañas para admitir varias versiones del modelo de programación de Node.js. El modelo v4 está disponible de forma general y está diseñado para que los desarrolladores de JavaScript y TypeScript tengan una experiencia más flexible e intuitiva. Para más detalles acerca de cómo funciona el modelo v4, consulte la Guía para desarrolladores de Node.js de Azure Functions. Para obtener más información sobre las diferencias entre v3 y v4, consulte la Guía de migración.

Ejemplos

Puede crear una función de C# mediante uno de los siguientes modos de C#:

  • Modelo de trabajo aislado: función compilada en C# que se ejecuta en un proceso trabajador aislado del tiempo de ejecución. Se requiere un proceso de trabajo aislado para admitir funciones de C# que se ejecutan en versiones de soporte técnico a largo plazo (LTS) y no LTS para .NET y .NET Framework.
  • Modelo en proceso: función de C# compilada que se ejecuta en el mismo proceso que el tiempo de ejecución de Azure Functions.
  • Script de C#: se usa principalmente al crear funciones de C# en Azure Portal.

Hay más ejemplos para el enlace de salida de Azure Database for MySQL en el repositorio de GitHub.

Esta sección contiene el ejemplo siguiente:

En este ejemplo se hace referencia a una clase Product y una tabla de base de datos correspondiente:

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

Desencadenador HTTP, escribir un registro

En el ejemplo siguiente se muestra una función de C# que agrega un registro a una base de datos mediante el uso de datos proporcionados en una solicitud HTTP POST como un cuerpo 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);
        }
    }
}

Hay más ejemplos para el enlace de salida de Azure Database for MySQL en el repositorio de GitHub.

Esta sección contiene el ejemplo siguiente:

En este ejemplo se hace referencia a una clase Product y una tabla de base de datos correspondiente:

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

Desencadenador HTTP, escritura de registros en una tabla

En el ejemplo siguiente se muestra un enlace de salida de Azure Database for MySQL en una función de Java que agrega un registro a una tabla mediante el uso de datos proporcionados en una solicitud HTTP POST como un cuerpo JSON. La función toma una dependencia adicional de la biblioteca com.google.code.gson para analizar el cuerpo 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();
    }
}

Hay más ejemplos para el enlace de salida de Azure Database for MySQL en el repositorio de GitHub.

Esta sección contiene el ejemplo siguiente:

En el ejemplo se hace referencia a una tabla de base de datos:

DROP TABLE IF EXISTS Products;

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

Desencadenador HTTP, escritura de registros en una tabla

En el ejemplo siguiente se muestra un enlace de salida de Azure Database for MySQL que agrega registros a una tabla mediante el uso de datos proporcionados en una solicitud HTTP POST como un cuerpo 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)
        };
    }
});

Hay más ejemplos para el enlace de salida de Azure Database for MySQL en el repositorio de GitHub.

Esta sección contiene el ejemplo siguiente:

En el ejemplo se hace referencia a una tabla de base de datos:

DROP TABLE IF EXISTS Products;

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

Desencadenador HTTP, escritura de registros en una tabla

En el ejemplo siguiente se muestra un enlace de salida de Azure Database for MySQL en un archivo function.json y una función de PowerShell que agrega registros a una tabla mediante el uso de datos proporcionados en una solicitud HTTP POST como un cuerpo JSON.

En el siguiente ejemplo se muestran los datos de enlace del archivo 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
}

En la sección Configuración se explican estas propiedades.

El ejemplo siguiente es código de PowerShell de ejemplo para la función en el archivo 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
})

Hay más ejemplos para el enlace de salida de Azure Database for MySQL en el repositorio de GitHub.

Esta sección contiene el ejemplo siguiente:

En el ejemplo se hace referencia a una tabla de base de datos:

DROP TABLE IF EXISTS Products;

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

Nota:

Debe usar la versión 1.22.0b4 de Azure Functions para Python.

Desencadenador HTTP, escritura de registros en una tabla

En el ejemplo siguiente se muestra un enlace de salida de Azure Database for MySQL en un archivo function.json y una función de Python que agrega registros a una tabla mediante datos proporcionados en una solicitud HTTP POST como un cuerpo JSON.

El ejemplo siguiente es código de Python de ejemplo para el archivo 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

La biblioteca de C# usa el MySqlAttribute atributo para declarar los enlaces mySQL en la función , que tiene las siguientes propiedades:

Propiedad de atributo Descripción
CommandText Necesario. Nombre de la tabla en la que escribe el enlace.
ConnectionStringSetting Necesario. Nombre de una configuración de aplicación que contiene la cadena de conexión de la base de datos en la que se escriben los datos. Este valor no es la cadena de conexión real y, en su lugar, debe resolverse en una variable de entorno.

anotaciones

En la biblioteca en tiempo de ejecución de funciones de Java, use la @MySQLOutput anotación en los parámetros cuyo valor provendría de Azure Database for MySQL. Esta anotación admite los siguientes elementos:

Elemento Descripción
commandText Necesario. Nombre de la tabla en la que escribe el enlace.
connectionStringSetting Necesario. Nombre de una configuración de aplicación que contiene la cadena de conexión de la base de datos en la que se escriben los datos. Este valor no es la cadena de conexión real y, en su lugar, debe resolverse en una variable de entorno.
name Necesario. Nombre único del enlace de la función.

Configuración

En la tabla siguiente se explican las propiedades que puede establecer en el options objeto pasado al output.generic() método :

Propiedad Descripción
commandText Necesario. Nombre de la tabla en la que escribe el enlace.
connectionStringSetting Necesario. Nombre de una configuración de aplicación que contiene la cadena de conexión de la base de datos en la que se escriben los datos. Este valor no es la cadena de conexión real y, en su lugar, debe resolverse en una variable de entorno.

Configuración

En la tabla siguiente se explican las propiedades de configuración de enlace establecidas en el archivo function.json:

Propiedad Descripción
type Necesario. Se debe establecer en Mysql.
direction Necesario. Se debe establecer en out.
name Necesario. Nombre de la variable que representa la entidad en el código de la función.
commandText Necesario. Nombre de la tabla en la que escribe el enlace.
connectionStringSetting Necesario. Nombre de una configuración de aplicación que contiene la cadena de conexión de la base de datos en la que se escriben los datos. Este valor no es la cadena de conexión real y, en su lugar, debe resolverse en una variable de entorno.

Cuando esté desarrollando localmente, agregue la configuración de la aplicación en el archivo local.settings.json de la colección Values.

Nota:

El enlace de salida admite todos los caracteres especiales, incluido el signo de dólar ($), la barra trasera ('), el guion (-) y el carácter de subrayado (_). Para más información, consulte la documentación de la comunidad de MySQL.

Un lenguaje de programación puede definir atributos de miembro que contengan caracteres especiales que admita. Por ejemplo, C# tiene algunas limitaciones para definir variables.

De lo contrario, puede usar JObject para el enlace de salida que cubre todos los caracteres especiales. Puede seguir un ejemplo detallado en GitHub.

Uso

La CommandText propiedad es el nombre de la tabla donde se almacenan los datos. El nombre de la configuración de la cadena de conexión corresponde a la configuración de la aplicación que contiene la cadena de conexión a Azure Database for MySQL.

Si se produce una excepción cuando se ejecuta un enlace de entrada mySQL, el código de función no se ejecutará. El resultado puede ser un código de error, como un desencadenador HTTP que devuelve un código de error 500.