Share via


快速入門:使用 Go 程式設計語言連線及查詢適用於 MySQL 的 Azure 資料庫的資料

適用於: 適用於 MySQL 的 Azure 資料庫 - 單一伺服器

重要

適用於 MySQL 的 Azure 資料庫 單一伺服器位於淘汰路徑上。 強烈建議您升級至適用於 MySQL 的 Azure 資料庫彈性伺服器。 如需移轉至適用於 MySQL 的 Azure 資料庫彈性伺服器的詳細資訊,請參閱適用於 MySQL 的 Azure 資料庫單一伺服器會發生什麼事?

本快速入門示範如何從 Windows、Ubuntu Linux 和 Apple macOS 平台使用以 Go 語言撰寫的程式碼,連線到適用於 MySQL 的 Azure 資料庫。 它會顯示如何使用 SQL 陳述式來查詢、插入、更新和刪除資料庫中的資料。 本主題假設您已熟悉使用 Go 進行開發,但不熟悉適用於 MySQL 的 Azure 資料庫。

必要條件

本快速入門使用在以下任一指南中建立的資源作為起點︰

重要

確保您用於連線的 IP 位址已使用 Azure 入口網站Azure CLI 新增伺服器的防火牆規則

安裝 Go 與 MySQL 連接器

在自己的電腦上安裝 Gogo-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 入口網站
  2. 從 Azure 入口網站的左側功能表中,按一下 [所有資源],然後搜尋您所建立的伺服器 (例如 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. 在程式碼中找出 HOSTDATABASEUSERPASSWORD 常數,然後將範例值取代成您自己的值。
  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 陳述式來連線至伺服器、建立資料表,以及載入資料。

程式碼會匯入三個套件:sql 套件適用於 mysql 的 go sql 驅動程式 (作為驅動程式來與 Azure Database for MySQL 通訊),以及 fmt 套件 (適用於命令列上列印的輸入和輸出)。

程式碼會呼叫 sql.Open() 以連線到Azure Database for MySQL,並使用 db.Ping() 方法檢查連線。 資料庫控制代碼會到處使用,並保留資料庫伺服器的連線集區。 程式碼會呼叫 Exec() 方法數次,以執行數個 DDL 命令。 程式碼也會使用 Prepare() 和 Exec() 來執行具有不同參數的備妥陳述式,以插入三個資料列。 每次都會使用自訂 checkError() 方法來檢查是否在發生錯誤時會緊急結束。

以您自己的值取代 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 陳述式來連線和讀取資料。

程式碼會匯入三個套件:sql 套件適用於 mysql 的 go sql 驅動程式 (作為驅動程式來與 Azure Database for MySQL 通訊),以及 fmt 套件 (適用於命令列上列印的輸入和輸出)。

程式碼會呼叫 sql.Open() 以連線到Azure Database for MySQL,並使用 db.Ping() 方法檢查連線。 資料庫控制代碼會到處使用,並保留資料庫伺服器的連線集區。 程式碼會呼叫 Query() 方法來執行 select 命令。 然後它會執行 Next() 來逐一查看結果集,以及執行 Scan() 來剖析資料行值,並將值儲存到變數中。 每次都會使用自訂 checkError() 方法來檢查是否在發生錯誤時會緊急結束。

以您自己的值取代 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 陳述式來連線和更新資料。

程式碼會匯入三個套件:sql 套件適用於 mysql 的 go sql 驅動程式 (作為驅動程式來與 Azure Database for MySQL 通訊),以及 fmt 套件 (適用於命令列上列印的輸入和輸出)。

程式碼會呼叫 sql.Open() 以連線到Azure Database for MySQL,並使用 db.Ping() 方法檢查連線。 資料庫控制代碼會到處使用,並保留資料庫伺服器的連線集區。 程式碼會呼叫 Exec() 方法來執行 update 命令。 每次都會使用自訂 checkError() 方法來檢查是否在發生錯誤時會緊急結束。

以您自己的值取代 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 陳述式來連線和移除資料。

程式碼會匯入三個套件:sql 套件適用於 mysql 的 go sql 驅動程式 (作為驅動程式來與 Azure Database for MySQL 通訊),以及 fmt 套件 (適用於命令列上列印的輸入和輸出)。

程式碼會呼叫 sql.Open() 以連線到Azure Database for MySQL,並使用 db.Ping() 方法檢查連線。 資料庫控制代碼會到處使用,並保留資料庫伺服器的連線集區。 程式碼會呼叫 Exec() 方法來執行 delete 命令。 每次都會使用自訂 checkError() 方法來檢查是否在發生錯誤時會緊急結束。

以您自己的值取代 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

下一步