从应用程序连接并查询 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 证书,如以下屏幕截图所示。

屏幕截图显示了 Azure 门户上的 Azure Database for MySQL 网络边栏选项卡。

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

适用于 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 应用中使用以下代码片段。 请务必将 hostusernamepassworddb_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 灵活服务器的连接。 请务必将 hostuserpassworddatabase 参数替换为你的值,并在 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();