アプリから Azure Database for MySQL フレキシブル サーバーに接続してクエリを実行する

完了

Azure Database for MySQL - フレキシブル サーバーを使用すると、好みのツール、言語、フレームワークを使用してアプリを柔軟に開発できます。 Visual Studio Code や GitHub などの強力な開発ツールを引き続き使用し、PHP、Java、Python、Node.js、C#、Ruby、Rust、Go などの任意のプログラミング言語を使用して開発できます。また、フレキシブル サーバーを WordPress や Drupal などの一般的なコンテンツ管理システム (CMS)、Moodle などの学習管理システム (LMS)、Magento などの eコマース プラットフォームと統合することもできます。

まず、選択した言語を使用して、アプリから Azure Database for MySQL フレキシブル サーバーに接続してクエリを実行するために必要なさまざまなタスクを見てみましょう。

1 - 接続情報を取得する

最初のタスクは、Azure Database for MySQL フレキシブル サーバーに接続するために必要な接続情報 (サーバー名、データベース名、サインイン資格情報) を取得することです。

Azure portal で、MySQL フレキシブル サーバー リソースに移動し、続いて [サーバー名][サーバー管理者ログイン名] をメモします。

2 - SSL 証明書を取得する

アプリで必ず Secure Sockets Layer (SSL) を使用して Azure Database for MySQL フレキシブル サーバーに接続するようにして、転送中のデータをセキュリティで保護することをお勧めします。 パブリック SSL 証明書は、次のスクリーンショットの中に示すように、Azure portal 内の [ネットワーク] ペインからダウンロードできます。

Azure portal の Azure Database for MySQL ネットワーク ブレードを示すスクリーンショット。

証明書ファイルをダウンロードし、希望の場所に保存します。

PHP 用 MySQL 拡張機能

PHP アプリから MySQL に接続するには、次の拡張機能のいずれかを使用できます。

  • MySQLi (MySQL Improved) 拡張機能。 MySQLi 拡張機能は PHP バージョン 5 以降に含まれており、MySQL データベースの接続と操作を簡略化するためのオブジェクト指向型インターフェイスと手続き型インターフェイスを提供します。
  • PDO_MYSQL。 PDO (PHP Data Objects) 拡張機能では、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 のパラメーターを実際の値に置き換えて、ダウンロードした SSL 証明書へのパスを mysqli_ssl_set() メソッドの中で指定してください。

$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`)
);
')

クエリに変数入力が含まれている場合は、代わりに、パラメーター化された準備済みのステートメントを使用します。 これにより、Web ハッカーによって使用される最も一般的な手法の 1 つである 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 Connector/Python (MySQL サーバーと通信するための自己完結型 Python ドライバー)、または PyMySQL を使用できます。

これらのコネクタは、Python パッケージ インストーラ pip を使用して簡単にインストールできます。 たとえば、pip install mysql-connector-python のように指定します。

3 - Python を使用して Azure Database for MySQL - フレキシブル サーバーに接続してクエリを実行する

接続するにはいくつかのオプションがありますが、このユニットでは、MySQL Connector/Python を使用して Python アプリから Azure Database for MySQL - フレキシブル サーバーに接続する方法について説明します。

接続を確立する

MySQL フレキシブル サーバーへの接続を確立するために Python アプリケーション内で使用できるコード スニペットを次に示します。 必ず hostuserpassworddatabase のパラメーターを実際の値に置き換えて、ダウンロードした SSL 証明書へのパスを ssl_ca オプションで指定してください。

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 Connector/Python はトランザクションを自動コミットしないため、データを変更するすべてのトランザクションの後に、conn.commit() など、接続オブジェクトの commit() メソッドを呼び出すことが重要です。

すべての操作を実行したら、カーソルと接続オブジェクトを閉じることをお勧めします。

cursor.close()
conn.close()

Java 用 MySQL コネクタ

Java アプリから MySQL に接続するには、クライアント ライブラリを利用するのではなく、MySQL Connector/J (Java で MySQL プロトコルをネイティブに実装する JDBC 互換 API) を使用できます。 MySQL Connector/J は、バイナリ配布からインストールするか、Apache Maven 依存関係マネージャーを使用してインストールすることができます。

または、Spring Data JPA などのフレームワークを使用して、Java から MySQL に接続することもできます。

3 - Java を使用して Azure Database for MySQL - フレキシブル サーバーに接続してクエリを実行する

接続するにはいくつかのオプションがありますが、このユニットでは、MySQL Connector/J を使用して Java アプリから Azure Database for MySQL - フレキシブル サーバーに接続する方法について説明します。

接続情報を保存する

ソース コードの resources セクションで 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");

クエリに変数入力が含まれている場合は、代わりに、パラメーター化された準備済みのステートメントを使用する必要があります。 これにより、Web ハッカーによって使用される最も一般的な手法の 1 つである SQL インジェクション攻撃を防ぎます。 準備したステートメントを使用するには、Connection オブジェクト上の prepareStatement() メソッドを呼び出して PreparedStatement オブジェクトを作成し、パラメーターをバインドしてから、executeUpdate() メソッドを使用して準備したステートメントを実行できます。

接続を閉じる

データベースの操作が完了したら、接続オブジェクトの close() メソッドを使用してデータベース接続を閉じることをお勧めします。 たとえば、connection.close(); のように指定します。