快速入门:使用 Node.js 连接到 Azure Database for MySQL 灵活服务器并查询其中的数据

注意

本文引用了 CentOS,这是一个接近生命周期结束 (EOL) 状态的 Linux 发行版。 请相应地考虑你的使用和规划。 有关详细信息,请参阅 CentOS 生命周期结束指南

适用于:Azure Database for MySQL - 灵活服务器

在本快速入门中,你将使用 Node.js 连接到 Azure Database for MySQL 灵活服务器。 然后使用 SQL 语句在 Mac、Linux 和 Windows 平台的数据库中查询、插入、更新和删除数据。

本文假设你熟悉如何使用 Node.js 进行开发,但不熟悉 Azure Database for MySQL 灵活服务器的用法。

先决条件

此快速入门使用以下任意指南中创建的资源作为起点:

重要

确保已使用 Azure 门户Azure CLI 将服务器的防火墙规则添加到连接的 IP 地址

安装 Node.js 和 MySQL 连接器

根据自己的平台,按照相应部分中的说明安装 Node.js。 使用 npm 将 mysql2 包及其依赖项安装到项目文件夹中。

  1. 请访问 Node.js 下载页,然后选择所需的 Windows 安装程序选项。

  2. 创建本地项目文件夹,例如 nodejsmysql

  3. 打开命令提示符,然后将目录更改为项目文件夹,例如 cd c:\nodejsmysql\

  4. 运行 NPM 工具,将 mysql2 库安装到项目文件夹中。

    cd c:\nodejsmysql\
    "C:\Program Files\nodejs\npm" install mysql2
    "C:\Program Files\nodejs\npm" list
    
  5. 通过检查 npm list 输出文本来验证安装。 随着新修补程序的发布,版本号可能会变化。

获取连接信息

获取连接到 Azure Database for MySQL 灵活服务器实例所需的连接信息。 需要完全限定的服务器名称和登录凭据。

  1. 登录 Azure 门户
  2. 在 Azure 门户的左侧菜单中,选择“所有资源”,然后搜索已创建的服务器(例如 mydemoserver)。
  3. 选择服务器名称。
  4. 从服务器的“概览”面板中记下“服务器名称”和“服务器管理员登录名”。 如果忘记了密码,也可通过此面板来重置密码。

运行代码示例

  1. 将 JavaScript 代码粘贴到新文本文件中,然后使用文件扩展名 .js 将其保存到项目文件夹中(例如 C:\nodejsmysql\createtable.js 或 /home/username/nodejsmysql/createtable.js)。
  2. 将代码中的 hostuserpassworddatabase 配置选项替换为你在创建 MySQL 灵活服务器和数据库时指定的值。
  3. 获取 SSL 证书:若要对客户端应用程序使用加密连接,需要下载公共 SSL 证书,该证书也在 Azure 门户“网络”边栏选项卡中提供,如以下屏幕截图中所示。 屏幕截图显示如何从 Azure 门户下载公共 SSL 证书。

将证书文件保存到首选位置。

  1. ssl 配置选项中,用此本地文件的路径替换 ca-cert 文件名。 这将允许该应用程序通过 SSL 安全连接到数据库。
  2. 打开命令提示符或 bash shell,然后将目录更改为项目文件夹 cd nodejsmysql
  3. 若要运行应用程序,请输入 node 命令并后接文件名,例如 node createtable.js
  4. 在 Windows 上,如果 Node 应用程序不在环境变量路径中,则可能需要使用完整路径来启动 Node 应用程序,例如 "C:\Program Files\nodejs\node.exe" createtable.js

进行连接,创建表,然后插入数据

通过以下代码进行连接,然后使用 CREATE TABLE 和 INSERT INTO SQL 语句加载数据。

mysql.createConnection() 方法用于与 Azure Database for MySQL 灵活服务器实例对接。 connect() 函数用于与服务器建立连接。 query() 函数用于针对 MySQL 数据库执行 SQL 查询。

const mysql = require('mysql2');
const fs = require('fs');

var config =
{
    host: 'your_server_name.mysql.database.chinacloudapi.cn',
    user: 'your_admin_name',
    password: 'your_admin_password',
    database: 'quickstartdb',
    port: 3306,
    ssl: {ca: fs.readFileSync("your_path_to_ca_cert_file_DigiCertGlobalRootCA.crt.pem")}
};

const conn = new mysql.createConnection(config);

conn.connect(
    function (err) {
    if (err) {
        console.log("!!! Cannot connect !!! Error:");
        throw err;
    }
    else
    {
        console.log("Connection established.");
        queryDatabase();
    }
});

function queryDatabase()
{
    conn.query('DROP TABLE IF EXISTS inventory;',
        function (err, results, fields) {
            if (err) throw err;
            console.log('Dropped inventory table if existed.');
        }
    )
    conn.query('CREATE TABLE inventory (id serial PRIMARY KEY, name VARCHAR(50), quantity INTEGER);',
        function (err, results, fields) {
            if (err) throw err;
            console.log('Created inventory table.');
        }
    )
    conn.query('INSERT INTO inventory (name, quantity) VALUES (?, ?);', ['banana', 150],
        function (err, results, fields) {
            if (err) throw err;
            else console.log('Inserted ' + results.affectedRows + ' row(s).');
        }
    )
    conn.query('INSERT INTO inventory (name, quantity) VALUES (?, ?);', ['orange', 250],
        function (err, results, fields) {
            if (err) throw err;
            console.log('Inserted ' + results.affectedRows + ' row(s).');
        }
    )
    conn.query('INSERT INTO inventory (name, quantity) VALUES (?, ?);', ['apple', 100],
        function (err, results, fields) {
            if (err) throw err;
            console.log('Inserted ' + results.affectedRows + ' row(s).');
        }
    )
    conn.end(function (err) {
        if (err) throw err;
        else  console.log('Done.')
    });
};

读取数据

使用以下代码进行连接,并使用 SELECT SQL 语句读取数据。

mysql.createConnection() 方法用于与 Azure Database for MySQL 灵活服务器实例对接。 connect() 方法用于与服务器建立连接。 query() 方法用于针对 MySQL 数据库执行 SQL 查询。 结果数组用于保存查询结果。

const mysql = require('mysql2');
const fs = require('fs');

var config =
{
    host: 'your_server_name.mysql.database.chinacloudapi.cn',
    user: 'your_admin_name',
    password: 'your_admin_password',
    database: 'quickstartdb',
    port: 3306,
    ssl: {ca: fs.readFileSync("your_path_to_ca_cert_file_DigiCertGlobalRootCA.crt.pem")}
};

const conn = new mysql.createConnection(config);

conn.connect(
    function (err) {
        if (err) {
            console.log("!!! Cannot connect !!! Error:");
            throw err;
        }
        else {
            console.log("Connection established.");
            readData();
        }
    });

function readData(){
    conn.query('SELECT * FROM inventory',
        function (err, results, fields) {
            if (err) throw err;
            else console.log('Selected ' + results.length + ' row(s).');
            for (i = 0; i < results.length; i++) {
                console.log('Row: ' + JSON.stringify(results[i]));
            }
            console.log('Done.');
        })
    conn.end(
        function (err) {
            if (err) throw err;
            else  console.log('Closing connection.')
    });
};

更新数据

使用以下代码进行连接,并使用 UPDATE SQL 语句更新数据。

mysql.createConnection() 方法用于与 Azure Database for MySQL 灵活服务器实例对接。 connect() 方法用于与服务器建立连接。 query() 方法用于针对 MySQL 数据库执行 SQL 查询。

const mysql = require('mysql2');
const fs = require('fs');

var config =
{
    host: 'your_server_name.mysql.database.chinacloudapi.cn',
    user: 'your_admin_name',
    password: 'your_admin_password',
    database: 'quickstartdb',
    port: 3306,
    ssl: {ca: fs.readFileSync("your_path_to_ca_cert_file_DigiCertGlobalRootCA.crt.pem")}
};

const conn = new mysql.createConnection(config);

conn.connect(
    function (err) {
        if (err) {
            console.log("!!! Cannot connect !!! Error:");
            throw err;
        }
        else {
            console.log("Connection established.");
            updateData();
        }
    });

function updateData(){
       conn.query('UPDATE inventory SET quantity = ? WHERE name = ?', [75, 'banana'],
            function (err, results, fields) {
                if (err) throw err;
                else console.log('Updated ' + results.affectedRows + ' row(s).');
           })
       conn.end(
           function (err) {
                if (err) throw err;
                else  console.log('Done.')
        });
};

删除数据

使用以下代码进行连接,并使用 DELETE SQL 语句删除数据。

mysql.createConnection() 方法用于与 Azure Database for MySQL 灵活服务器实例对接。 connect() 方法用于与服务器建立连接。 query() 方法用于针对 MySQL 数据库执行 SQL 查询。

const mysql = require('mysql2');
const fs = require('fs');

var config =
{
    host: 'your_server_name.mysql.database.chinacloudapi.cn',
    user: 'your_admin_name',
    password: 'your_admin_password',
    database: 'quickstartdb',
    port: 3306,
    ssl: {ca: fs.readFileSync("your_path_to_ca_cert_file_DigiCertGlobalRootCA.crt.pem")}
};

const conn = new mysql.createConnection(config);

conn.connect(
    function (err) {
        if (err) {
            console.log("!!! Cannot connect !!! Error:");
            throw err;
        }
        else {
            console.log("Connection established.");
            deleteData();
        }
    });

function deleteData(){
       conn.query('DELETE FROM inventory WHERE name = ?', ['orange'],
            function (err, results, fields) {
                if (err) throw err;
                else console.log('Deleted ' + results.affectedRows + ' row(s).');
           })
       conn.end(
           function (err) {
                if (err) throw err;
                else  console.log('Done.')
        });
};

清理资源

若要清理本快速入门中使用的所有资源,请使用以下命令删除该资源组:

az group delete \
    --name $AZ_RESOURCE_GROUP \
    --yes

后续步骤