MySQL In App en Azure App Service, la base de datos para desarrollo y pruebas

En algunas ocasiones nos hemos visto en proyectos donde la base de datos a utilizar es MySQL y lo cierto es que en Microsoft Azure a día de hoy tienes varias alternativas para utilizar esta base de datos, como ClearDB, instalarlo en una máquina virtual o incluso el uso de contenedores. Todas ellas generan un gasto adicional que es posible que para entornos de desarrollos y pruebas no esté del todo justificado.

Por ello, el equipo de App Service a puesto a disposición del desarrollador MySQL In App (en preview), que te permite tener dentro del propio App Service una base de datos para desarrollo y pruebas exclusivamente.

MySQL In App - Preview
MySQL In App – Preview

Para poder usarlo, basta con acceder a la sección que te mostraba en la imagen anterior y cambiar el estado a ON.

Enable MySQL In App
Enable MySQL In App

En mi caso he habilitado además los logs para tener toda la información disponible en la carpeta D:/home/logfiles. En el momento que la base de datos MySQL quede habilitada, podrás ver la opción Manage que te llevará al portal phpAdmin.

MySQL In App - Manage
MySQL In App – Manage

donde podrás gestionar la base de datos llamada localdb.

MySQL In App - PhpAdmin
MySQL In App – PhpAdmin

Como ya sabes, desde el propio phpMyAdmin puedes crear todo lo que necesites en tu base de datos. La forma de acceder a la misma a través de código es utilizando la cadena de conexión MYSQLCONNSTR_localdb. Dependiendo del lenguaje de programación que utilices podrás acceder a ella de una forma u otra. En el caso de PHP sería de la siguiente forma, como se detalla en el anuncio oficial:

$connectstr_dbhost = '';
$connectstr_dbname = '';
$connectstr_dbusername = '';
$connectstr_dbpassword = '';

foreach ($_SERVER as $key => $value) {
    if (strpos($key, "MYSQLCONNSTR_localdb") !== 0) {
        continue;
    }
    
    $connectstr_dbhost = preg_replace("/^.*Data Source=(.+?);.*$/", "\\1", $value);
    $connectstr_dbname = preg_replace("/^.*Database=(.+?);.*$/", "\\1", $value);
    $connectstr_dbusername = preg_replace("/^.*User Id=(.+?);.*$/", "\\1", $value);
    $connectstr_dbpassword = preg_replace("/^.*Password=(.+?)$/", "\\1", $value);
}

$link = mysqli_connect($connectstr_dbhost, $connectstr_dbusername, $connectstr_dbpassword,$connectstr_dbname);

if (!$link) {
    echo "Error: Unable to connect to MySQL." . PHP_EOL;
    echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;
    echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;
    exit;
}

echo "Success: A proper connection to MySQL was made! The my_db database is great." . PHP_EOL;
echo "Host information: " . mysqli_get_host_info($link) . PHP_EOL;

mysqli_close($link);

Para Node.js te dejo este ejemplo, donde te enseño cómo utilizar la cadena de conexión y algunas tareas comunes en MySQL, para que compruebes que todo funciona perfectamente:

var mysql = require('mysql'),
    mySQLconnString = process.env.MYSQLCONNSTR_localdb,
    exports = module.exports = {};

exports.test = function() {

    console.log('MYSQLCONNSTR_localdb');
    console.log(process.env.MYSQLCONNSTR_localdb);

    function getElement(params, key) {
        for (var i = 0; i < params.length; i++) { if (params[i].indexOf(key) > -1) {
                return params[i].substring(params[i].indexOf('=') + 1);
            }
        }

        throw "Key doesn't exist!";
    }

    var params = mySQLconnString.split(';'),
        dbhost = getElement(params, 'Data Source'),
        dbport = dbhost.substring(dbhost.indexOf(':') + 1),
        dbhost = dbhost.substring(0, dbhost.indexOf(':')); //host without port    

    var connection = mysql.createConnection({
        host: dbhost,
        port: dbport,
        user: getElement(params, 'User Id'),
        password: getElement(params, 'Password'),
        database: getElement(params, 'Database')

    });

    connection.connect(function(error) {
        if (error);
        console.error(error);
    });

    connection.query('DROP TABLE test', function(err, result) {

        if (!err) {
            console.log('Result: ', result);
        }
        else {
            console.error(err);
        }
    });

    connection.query('CREATE TABLE test (id INT(100) NOT NULL AUTO_INCREMENT, name VARCHAR(50), PRIMARY KEY(id))', function(err, result) {

        if (!err) {
            console.log('Result: ', result);
        }
        else {
            console.error(err);
        }
    });

    var values = { name: 'Gisela' };
    connection.query('INSERT INTO test SET ?', values, function(err, result) {
        if (err) {
            console.error(err);
        }
    });

    connection.query('SELECT * from test', function(err, rows, fields) {

        if (!err) {
            console.log('Rows: ', rows);
        }
        else {
            console.log('error:', err);
        }
    });

    connection.end();
};

Espero que sea de utilidad.

¡Saludos!