快速入门:使用 Node.js 连接到 Azure Database for MySQL 灵活服务器并查询其中的数据
在本快速入门中,你将使用 Node.js 连接到 Azure Database for MySQL 灵活服务器。 然后使用 SQL 语句在 Mac、Linux 和 Windows 平台的数据库中查询、插入、更新和删除数据。
本文假设你熟悉如何使用 Node.js 进行开发,但不熟悉 Azure Database for MySQL 灵活服务器的用法。
先决条件
此快速入门使用以下任意指南中创建的资源作为起点:
- 快速入门:使用 Azure 门户创建 Azure Database for MySQL 的实例
- 快速入门:使用 Azure CLI 创建 Azure Database for MySQL 灵活服务器的实例
重要
确保你从中连接的 IP 地址已使用使用 Azure 门户在 Azure Database for MySQL 灵活服务器中管理防火墙规则或使用 Azure CLI 为 Azure Database for MySQL 灵活服务器管理防火墙规则添加了服务器的防火墙规则
安装 Node.js 和 MySQL 连接器
根据自己的平台,按照相应部分中的说明安装 Node.js。 使用 npm 将 mysql2 包及其依赖项安装到项目文件夹中。
请访问 Node.js 下载页,然后选择所需的 Windows 安装程序选项。
创建本地项目文件夹,例如
nodejsmysql
。打开命令提示符,然后将目录更改为项目文件夹,例如
cd c:\nodejsmysql\
运行 NPM 工具,将 mysql2 库安装到项目文件夹中。
cd c:\nodejsmysql\ "C:\Program Files\nodejs\npm" install mysql2 "C:\Program Files\nodejs\npm" list
通过检查
npm list
输出文本来验证安装。 随着新修补程序的发布,版本号可能会变化。
获取连接信息
获取连接到 Azure Database for MySQL 灵活服务器实例所需的连接信息。 需要完全限定的服务器名称和登录凭据。
- 登录 Azure 门户。
- 在 Azure 门户的左侧菜单中,选择“所有资源”,然后搜索已创建的服务器(例如 mydemoserver)。
- 选择服务器名称。
- 从服务器的“概览”面板中记下“服务器名称”和“服务器管理员登录名”。 如果忘记了密码,也可通过此面板来重置密码。
运行代码示例
- 将 JavaScript 代码粘贴到新文本文件中,然后使用文件扩展名 .js 将其保存到项目文件夹中(例如 C:\nodejsmysql\createtable.js 或 /home/username/nodejsmysql/createtable.js)。
- 将代码中的
host
、user
、password
和database
配置选项替换为你在创建 MySQL 灵活服务器和数据库时指定的值。 - 获取 SSL 证书:若要对客户端应用程序使用加密连接,需要下载公共 SSL 证书,该证书也在 Azure 门户“网络”边栏选项卡中提供,如以下屏幕截图中所示。
将证书文件保存到首选位置。
- 在
ssl
配置选项中,用此本地文件的路径替换ca-cert
文件名。 这将允许该应用程序通过 SSL 安全连接到数据库。 - 打开命令提示符或 bash shell,然后将目录更改为项目文件夹
cd nodejsmysql
。 - 若要运行应用程序,请输入 node 命令并后接文件名,例如
node createtable.js
。 - 在 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