クイック スタート:Go 言語を使用して Azure Database for MySQL に接続してデータを照会する

適用対象: Azure Database for MySQL - シングル サーバー

重要

Azure Database for MySQL の単一サーバーは提供終了パスにあります。 Azure Database for MySQL フレキシブル サーバーにアップグレードすることを強くお勧めします。 Azure Database for MySQL フレキシブル サーバーへの移行の詳細については、「Azure Database for MySQL 単一サーバーの動作」を参照してください

このクイックスタートでは、Windows、Ubuntu Linux、Apple macOS の各プラットフォームから、Go 言語で記述されたコードを使用して Azure Database for MySQL に接続する方法を紹介します。 ここでは、SQL ステートメントを使用してデータベース内のデータを照会、挿入、更新、削除する方法を説明します。 このトピックでは、Go を使用した開発には慣れているものの、Azure Database for MySQL の使用は初めてであるユーザーを想定しています。

前提条件

このクイックスタートでは、次のいずれかのガイドで作成されたリソースを出発点として使用します。

重要

Azure portal または Azure CLI を使用して、接続元の IP アドレスにサーバーのファイアウォール規則が追加されていることを確認します。

Go と MySQL コネクタのインストール

ご使用のコンピューターに Go および go-sql-driver for MySQL をインストールします。 プラットフォームに応じて、該当するセクションの手順に従ってください。

  1. Go for Microsoft Windows をダウンロードし、インストール手順に従ってインストールします。

  2. スタート メニューからコマンド プロンプトを起動します。

  3. プロジェクトのフォルダーを作成します。 mkdir %USERPROFILE%\go\src\mysqlgo.

  4. ディレクトリをプロジェクト フォルダーに変更します (例: cd %USERPROFILE%\go\src\mysqlgo)。

  5. GOPATH の環境変数がソース コード ディレクトリをポイントするように設定します。 set GOPATH=%USERPROFILE%\go.

  6. go get github.com/go-sql-driver/mysql コマンドを実行して go-sql-driver for mysql をインストールします。

    まとめると、Go をインストールしてから、コマンド プロンプトで以下のコマンドを実行します。

    mkdir  %USERPROFILE%\go\src\mysqlgo
    cd %USERPROFILE%\go\src\mysqlgo
    set GOPATH=%USERPROFILE%\go
    go get github.com/go-sql-driver/mysql
    

接続情報の取得

Azure Database for MySQL に接続するために必要な接続情報を取得します。 完全修飾サーバー名とログイン資格情報が必要です。

  1. Azure Portal にログインします。
  2. Azure Portal の左側のメニューにある [すべてのリソース] をクリックし、作成したサーバー (例: mydemoserver) を検索します。
  3. サーバー名をクリックします。
  4. サーバーの [概要] パネルから、 [サーバー名][サーバー管理者ログイン名] を書き留めます。 パスワードを忘れた場合も、このパネルからパスワードをリセットすることができます。 Azure Database for MySQL server name

Go コードのビルドと実行

  1. Golang コードを記述するには、Microsoft Windows のメモ帳、Ubuntu の viNano、macOS の TextEdit などのシンプルなテキスト エディターを使用できます。 充実した対話的な開発環境 (IDE) の方が好ましい場合は、Jetbrains の Gogland、Microsoft の Visual Studio Code、または Atom をお試しください。
  2. 以下のセクションからテキスト ファイルに Go コードを貼り付け、*.go というファイル拡張子でプロジェクト フォルダーに保存します (たとえば、Windows の場合は %USERPROFILE%\go\src\mysqlgo\createtable.go に、Linux の場合は ~/go/src/mysqlgo/createtable.go に保存します)。
  3. コード内で HOSTDATABASEUSER、および PASSWORD の定数を見つけて、サンプルの値を独自の値で置き換えます。
  4. コマンド プロンプトまたは Bash シェルを起動します。 ディレクトリをプロジェクト フォルダーに変更します。 たとえば Windows の場合、「cd %USERPROFILE%\go\src\mysqlgo\」と入力します。 Linux の場合は、「cd ~/go/src/mysqlgo/」と入力します。 前述した一部の IDE エディターでは、シェル コマンドを必要とせずに、デバッグとランタイムの機能が提供されています。
  5. コマンド「go run createtable.go」を入力してコードを実行し、アプリケーションをコンパイルして実行します。
  6. または、コードをネイティブ アプリケーションとしてビルドするには、go build createtable.go を実行し、createtable.exe を起動してアプリケーションを実行します。

接続、テーブルの作成、データの挿入

サーバーに接続し、テーブルを作成した後、INSERT SQL ステートメントを使用してデータを読み込むには、次のコードを使用します。

このコードでは、3 つのパッケージをインポートします。sql パッケージ、Azure Database for MySQL と通信するためのドライバーである go sql driver for mysql、コマンド ラインで入力と出力を表示するための fmt パッケージです。

このコードでは、sql.Open() メソッドを呼び出して Azure Database for MySQL に接続し、db.Ping() メソッドを使用してその接続を確認します。 データベース ハンドルが全体を通して使用され、データベース サーバーの接続プールが保持されます。 このコードでは、複数の DDL コマンドを実行するために Exec() メソッドを数回呼び出しています。 また、このコードは、Prepare() と Exec() を使用して、準備済みステートメントを実行し、異なるパラメーターを使って 3 つの行を挿入しています。 毎回、カスタム checkError() メソッドによってエラーが発生したかどうかがチェックされ、エラーが発生した場合は panic によってプログラムが終了します。

hostdatabaseuserpassword の各定数は、実際の値に置き換えてください。

package main

import (
	"database/sql"
	"fmt"

	_ "github.com/go-sql-driver/mysql"
)

const (
	host     = "mydemoserver.mysql.database.azure.com"
	database = "quickstartdb"
	user     = "myadmin@mydemoserver"
	password = "yourpassword"
)

func checkError(err error) {
	if err != nil {
		panic(err)
	}
}

func main() {

	// Initialize connection string.
	var connectionString = fmt.Sprintf("%s:%s@tcp(%s:3306)/%s?allowNativePasswords=true", user, password, host, database)

	// Initialize connection object.
	db, err := sql.Open("mysql", connectionString)
	checkError(err)
	defer db.Close()

	err = db.Ping()
	checkError(err)
	fmt.Println("Successfully created connection to database.")

	// Drop previous table of same name if one exists.
	_, err = db.Exec("DROP TABLE IF EXISTS inventory;")
	checkError(err)
	fmt.Println("Finished dropping table (if existed).")

	// Create table.
	_, err = db.Exec("CREATE TABLE inventory (id serial PRIMARY KEY, name VARCHAR(50), quantity INTEGER);")
	checkError(err)
	fmt.Println("Finished creating table.")

	// Insert some data into table.
	sqlStatement, err := db.Prepare("INSERT INTO inventory (name, quantity) VALUES (?, ?);")
	res, err := sqlStatement.Exec("banana", 150)
	checkError(err)
	rowCount, err := res.RowsAffected()
	fmt.Printf("Inserted %d row(s) of data.\n", rowCount)

	res, err = sqlStatement.Exec("orange", 154)
	checkError(err)
	rowCount, err = res.RowsAffected()
	fmt.Printf("Inserted %d row(s) of data.\n", rowCount)

	res, err = sqlStatement.Exec("apple", 100)
	checkError(err)
	rowCount, err = res.RowsAffected()
	fmt.Printf("Inserted %d row(s) of data.\n", rowCount)
	fmt.Println("Done.")
}

データの読み取り

接続し、SELECT SQL ステートメントを使用してデータを読み取るには、次のコードを使用します。

このコードでは、3 つのパッケージをインポートします。sql パッケージ、Azure Database for MySQL と通信するためのドライバーである go sql driver for mysql、コマンド ラインで入力と出力を表示するための fmt パッケージです。

このコードでは、sql.Open() メソッドを呼び出して Azure Database for MySQL に接続し、db.Ping() メソッドを使用してその接続を確認します。 データベース ハンドルが全体を通して使用され、データベース サーバーの接続プールが保持されます。 このコードは、Query() メソッドを呼び出して select コマンドを実行します。 次に、Next() を実行して結果セットを反復処理し、Scan() を使用して列の値を解析しながら、その値を変数に保存していきます。 毎回、カスタム checkError() メソッドによってエラーが発生したかどうかがチェックされ、エラーが発生した場合は panic によってプログラムが終了します。

hostdatabaseuserpassword の各定数は、実際の値に置き換えてください。

package main

import (
	"database/sql"
	"fmt"

	_ "github.com/go-sql-driver/mysql"
)

const (
	host     = "mydemoserver.mysql.database.azure.com"
	database = "quickstartdb"
	user     = "myadmin@mydemoserver"
	password = "yourpassword"
)

func checkError(err error) {
	if err != nil {
		panic(err)
	}
}

func main() {

	// Initialize connection string.
	var connectionString = fmt.Sprintf("%s:%s@tcp(%s:3306)/%s?allowNativePasswords=true", user, password, host, database)

	// Initialize connection object.
	db, err := sql.Open("mysql", connectionString)
	checkError(err)
	defer db.Close()

	err = db.Ping()
	checkError(err)
	fmt.Println("Successfully created connection to database.")

	// Variables for printing column data when scanned.
	var (
		id       int
		name     string
		quantity int
	)

	// Read some data from the table.
	rows, err := db.Query("SELECT id, name, quantity from inventory;")
	checkError(err)
	defer rows.Close()
	fmt.Println("Reading data:")
	for rows.Next() {
		err := rows.Scan(&id, &name, &quantity)
		checkError(err)
		fmt.Printf("Data row = (%d, %s, %d)\n", id, name, quantity)
	}
	err = rows.Err()
	checkError(err)
	fmt.Println("Done.")
}

データの更新

接続し、UPDATE SQL ステートメントを使用してデータを更新するには、次のコードを使用します。

このコードでは、3 つのパッケージをインポートします。sql パッケージ、Azure Database for MySQL と通信するためのドライバーである go sql driver for mysql、コマンド ラインで入力と出力を表示するための fmt パッケージです。

このコードでは、sql.Open() メソッドを呼び出して Azure Database for MySQL に接続し、db.Ping() メソッドを使用してその接続を確認します。 データベース ハンドルが全体を通して使用され、データベース サーバーの接続プールが保持されます。 このコードは、Exec() メソッドを呼び出して update コマンドを実行します。 毎回、カスタム checkError() メソッドによってエラーが発生したかどうかがチェックされ、エラーが発生した場合は panic によってプログラムが終了します。

hostdatabaseuserpassword の各定数は、実際の値に置き換えてください。

package main

import (
	"database/sql"
	"fmt"

	_ "github.com/go-sql-driver/mysql"
)

const (
	host     = "mydemoserver.mysql.database.azure.com"
	database = "quickstartdb"
	user     = "myadmin@mydemoserver"
	password = "yourpassword"
)

func checkError(err error) {
	if err != nil {
		panic(err)
	}
}

func main() {

	// Initialize connection string.
	var connectionString = fmt.Sprintf("%s:%s@tcp(%s:3306)/%s?allowNativePasswords=true", user, password, host, database)

	// Initialize connection object.
	db, err := sql.Open("mysql", connectionString)
	checkError(err)
	defer db.Close()

	err = db.Ping()
	checkError(err)
	fmt.Println("Successfully created connection to database.")

	// Modify some data in table.
	rows, err := db.Exec("UPDATE inventory SET quantity = ? WHERE name = ?", 200, "banana")
	checkError(err)
	rowCount, err := rows.RowsAffected()
	fmt.Printf("Updated %d row(s) of data.\n", rowCount)
	fmt.Println("Done.")
}

データの削除

接続し、DELETE SQL ステートメントを使用してデータを削除するには、次のコードを使用します。

このコードでは、3 つのパッケージをインポートします。sql パッケージ、Azure Database for MySQL と通信するためのドライバーである go sql driver for mysql、コマンド ラインで入力と出力を表示するための fmt パッケージです。

このコードでは、sql.Open() メソッドを呼び出して Azure Database for MySQL に接続し、db.Ping() メソッドを使用してその接続を確認します。 データベース ハンドルが全体を通して使用され、データベース サーバーの接続プールが保持されます。 このコードは、Exec() メソッドを呼び出して delete コマンドを実行します。 毎回、カスタム checkError() メソッドによってエラーが発生したかどうかがチェックされ、エラーが発生した場合は panic によってプログラムが終了します。

hostdatabaseuserpassword の各定数は、実際の値に置き換えてください。

package main

import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
)

const (
	host     = "mydemoserver.mysql.database.azure.com"
	database = "quickstartdb"
	user     = "myadmin@mydemoserver"
	password = "yourpassword"
)

func checkError(err error) {
	if err != nil {
		panic(err)
	}
}

func main() {

	// Initialize connection string.
	var connectionString = fmt.Sprintf("%s:%s@tcp(%s:3306)/%s?allowNativePasswords=true", user, password, host, database)

	// Initialize connection object.
	db, err := sql.Open("mysql", connectionString)
	checkError(err)
	defer db.Close()

	err = db.Ping()
	checkError(err)
	fmt.Println("Successfully created connection to database.")

	// Modify some data in table.
	rows, err := db.Exec("DELETE FROM inventory WHERE name = ?", "orange")
	checkError(err)
	rowCount, err := rows.RowsAffected()
	fmt.Printf("Deleted %d row(s) of data.\n", rowCount)
	fmt.Println("Done.")
}

リソースをクリーンアップする

このクイックスタートで使用したすべてのリソースをクリーンアップするには、次のコマンドを使用してリソース グループを削除します。

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

次のステップ