从应用程序连接并查询 Azure Database for MySQL 灵活服务器
通过 Azure Database for MySQL 灵活服务器,你可以灵活地使用你喜欢的工具、语言和框架开发应用。 可以继续使用强大的开发工具(如 Visual Studio Code 和 GitHub),并使用任何编程语言(如 PHP、Java、Python、Node.js、C#、Ruby、Rust、Go 等)进行开发。还可以将灵活服务器与热门的内容管理系统 (CMS)(如 WordPress 或 Drupal)、学习管理系统 (LMS)(如 Moodle)、电子商务平台(如 Magento)等集成。
首先了解从采用所选语言的应用程序连接和查询 Azure Database for MySQL 灵活服务器所涉及的各个任务。
1 - 获取连接信息
第一个任务是获取连接到 Azure Database for MySQL 灵活服务器所需的连接信息(服务器名称、数据库名称和登录凭据)。
在 Azure 门户中,导航到 MySQL 灵活服务器资源,然后记下服务器名称和服务器管理员登录名。
2 - 获取 SSL 证书
建议通过确保应用使用安全套接字层 (SSL) 连接到 Azure Database for MySQL 灵活服务器来保护传输中的数据。 可以从 Azure 门户中的“网络”边栏选项卡下载公共 SSL 证书,如以下屏幕截图所示。
将证书文件保存到首选位置。
适用于 PHP 的 MySQL 扩展
若要从 PHP 应用连接到 MySQL,可以使用以下扩展之一:
- MySQLi(MySQL 改进)扩展。 MySQLi 扩展包含在 PHP 5 及更高版本中,并提供面向对象和过程的接口以简化连接和使用 MySQL 数据库。
- PDO_MYSQL。 PDO 或 PHP 数据对象扩展定义了一个用于在 PHP 中访问数据库的接口。 PDO_MYSQL 是一个 MySQL 特定的驱动程序,它实现了 PDO 接口,以便可以从 PHP 访问 MySQL 数据库。
若要使用扩展,需要在 php.ini
配置文件中通过取消注释关联行来启用该扩展。 例如,如果要使用 MySQLi,请取消评论文件中的 extension=mysqli
行。
3 - 使用 PHP 连接和查询 MySQL 灵活服务器
虽然提供了连接选项,但本单元仍展示了如何使用 MySQLi 扩展从 PHP 应用程序连接到 Azure Database for MySQL 灵活服务器。
你还需要使用 OpenSSL 扩展通过 SSL 建立加密连接。 正如对 MySQLi 所做的那样,通过取消评论 php.ini
文件中的 extension=openssl
行来启用 OpenSSL 扩展。
建立连接
若要使用 MySQLi 建立与 MySQL 灵活服务器的连接,可以在 PHP 应用中使用以下代码片段。 请务必将 host
、username
、password
和 db_name
参数替换为你的值,然后在 mysqli_ssl_set()
方法中提供指向下载的 SSL 证书的路径。
$host = '<your_server_name>.mysql.database.azure.com';
$username = '<your_admin_username';
$password = '<your_password>';
$db_name = '<your_database_name>';
$conn = mysqli_init();
mysqli_ssl_set($conn,NULL,NULL, "<your_path_to_SSL_cert>", NULL, NULL);
mysqli_real_connect($conn, $host, $username, $password, $db_name, 3306, MYSQLI_CLIENT_SSL);
if (mysqli_connect_errno($conn)) {
die('Failed to connect to MySQL: '.mysqli_connect_error());
}
printf("Connection Established.\n");
mysqli_init()
方法会初始化 MySQLi 并返回一个用于mysqli_real_connect()
的对象mysqli_ssl_set()
用于使用 SSL 建立安全连接。 此方法采用下载的 SSL 证书的路径。 除非启用了 OpenSSL 扩展,否则此函数不会执行任何操作。mysqli_real_connect()
方法可打开与 MySQL 数据库引擎的连接。 将 MySQL 灵活服务器连接信息作为参数传递以建立与它的连接。
执行数据库操作
建立与灵活服务器数据库的连接后,使用 mysqli_query()
等方法执行查询。 例如:
mysqli_query($conn, '
CREATE TABLE Products (
`Id` INT NOT NULL AUTO_INCREMENT ,
`ProductName` VARCHAR(200) NOT NULL ,
`Price` DOUBLE NOT NULL ,
PRIMARY KEY (`Id`)
);
')
如果查询包含任何变量输入,则改用准备好的参数化语句。 此操作可以防范 SQL 注入攻击,它是网络黑客最常用的技术之一。
下面是一个代码片段,它通过将准备好的语句与 MySQLi 一起使用来将数据插入表中。
$product_name = 'BrandNewProduct';
$product_price = 15;
//Create a prepared statement
if ($stmt = mysqli_prepare($conn, "INSERT INTO Products (ProductName, Price) VALUES (?, ?)")) {
//Binds the parameters for each column value
mysqli_stmt_bind_param($stmt, 'ssd', $product_name, $product_price);
//Run the prepared statement
mysqli_stmt_execute($stmt);
printf("Insert: Affected %d rows\n", mysqli_stmt_affected_rows($stmt));
//Close the prepared statement
mysqli_stmt_close($stmt);
}
关闭连接
完成数据库操作后,良好的做法是使用 mysqli_close()
方法关闭数据库连接。
mysqli_close($conn);
适用于 Python 的 MySQL 连接器
若要从 Python 应用连接到 MySQL,可以使用 MySQL 连接器/Python(一种用于与 MySQL 服务器或 PyMySQL 通信的独立式 Python 驱动程序)。
可以使用 Python 包安装程序 pip
轻松安装这些连接器。 例如: pip install mysql-connector-python
3 - 使用 Python 连接并查询 Azure Database for MySQL - 灵活服务器
虽然可以使用连接选项,但本单元仍展示了如何使用 MySQL 连接器/Python 从 Python 应用连接到 Azure Database for MySQL - 灵活服务器。
建立连接
下面是一个代码片段,你可以在 Python 应用中使用它来建立与 MySQL 灵活服务器的连接。 请务必将 host
、user
、password
和 database
参数替换为你的值,并在 ssl_ca
选项下提供指向下载的 SSL 证书的路径。
import mysql.connector
from mysql.connector import errorcode
# Flexible server connection information
config = {
'host':'<your_server_name>.mysql.database.azure.com',
'user':'<your_admin_username>',
'password':'<your_password>',
'database':'<your_database_name>',
'client_flags': [mysql.connector.ClientFlag.SSL],
'ssl_ca': '<your_path_to_SSL_cert>'
}
# Establish connection and obtain cursor object
try:
conn = mysql.connector.connect(**config)
print("Connection established")
except mysql.connector.Error as err:
if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
print("Something is wrong with the user name or password")
elif err.errno == errorcode.ER_BAD_DB_ERROR:
print("Database does not exist")
else:
print(err)
else:
cursor = conn.cursor()
mysql.connector.connect()
方法可设置与 MySQL 服务器的连接并返回一个连接对象。 将 MySQL 灵活服务器连接信息对象作为参数传递以建立与它的连接。- 该连接对象的
cursor()
方法可创建一个可用于和 MySQL 服务器交互的游标。
执行数据库操作
建立与 MySQL 灵活服务器数据库的连接后,使用光标对象并调用 cursor.execute()
方法来执行任何数据库操作。 例如:
# Create table
cursor.execute("CREATE TABLE inventory (id serial PRIMARY KEY, name VARCHAR(50), quantity INTEGER);")
# Insert some data into table
cursor.execute("INSERT INTO inventory (name, quantity) VALUES (%s, %s);", ("banana", 150))
关闭连接
MySQL 连接器/Python 不会自动提交事务,因此务必在修改数据的每个事务之后调用连接对象的 commit()
方法,如 conn.commit()
。
执行所有操作后,最好关闭游标和连接对象。
cursor.close()
conn.close()
适用于 Java 的 MySQL 连接器
若要从 Java 应用连接到 MySQL,可以使用 MySQL 连接器/J,这是一种与 JDBC 兼容的 API,它在 Java 中本机实现 MySQL 协议,而不是使用客户端库。 可以从二进制分发或使用 Apache Maven 依赖项管理器安装 MySQL 连接器/J。
或者,也可以使用 Spring Data JPA 等框架从 Java 连接到 MySQL。
3 - 使用 Java 连接并查询 Azure Database for MySQL - 灵活服务器
虽然可以使用选项进行连接,但本单元仍展示了如何使用 MySQL 连接器/J 从 Java 应用连接到 Azure Database for MySQL - 灵活服务器。
存储连接信息
最好在源代码的资源部分创建一个 application.properties
文件来存储 MySQL 灵活服务器连接信息。
url=jdbc:mysql://<your_server_name>.mysql.database.azure.com:3306/<your_database_name>?serverTimezone=UTC
user=<your_admin_username>
password=<your_password>
建立连接
在应用程序服务器外部使用 JDBC 时,java.sql 包中的 DriverManager 类会管理连接的建立。 若要连接到 MySQL 灵活服务器,首先从 application.properties
文件加载连接属性,然后通过将这些连接属性传递给 DriverManager 的 getConnection()
方法来调用它。
import java.sql.*;
public class DemoApplication {
public static void main(String[] args) throws Exception {
//Load application properties
Properties properties = new Properties();
properties.load(DemoApplication.class.getClassLoader().getResourceAsStream("application.properties"));
//Establish Connection to database
Connection connection = DriverManager.getConnection(properties.getProperty("url"), properties);
.
.
}
}
执行数据库操作
建立连接并获取 Connection
对象后,可以对该对象调用 createStatement()
方法以创建 Statement
对象。
拥有 Statement
实例后,可以通过使用要使用的 SQL 调用 executeQuery(String)
方法来执行 SELECT
查询。 若要更新数据库中的数据,请使用 executeUpdate(String SQL)
方法。
例如:
Statement statement = connection.createStatement();
statement.execute("CREATE TABLE inventory (id serial PRIMARY KEY, name VARCHAR(50), quantity INTEGER)");
statement.executeUpdate("INSERT INTO inventory (name, quantity) VALUES (\"banana\", 150)");
ResultSet resultSet = statement.executeQuery("SELECT * FROM inventory");
如果查询包含任何变量输入,则应改用准备好的参数化语句。 此操作可以防范 SQL 注入攻击,它是网络黑客最常用的技术之一。 要使用准备好的语句,可以对 Connection
对象调用 prepareStatement()
方法来创建 PreparedStatement
对象,绑定参数,然后使用 executeUpdate()
方法运行准备好的语句。
关闭连接
完成数据库操作后,最好使用连接对象的 close()
方法关闭数据库连接。 例如: connection.close();