快速入門:使用 Go 程式設計語言連線及查詢適用於 MySQL 的 Azure 資料庫的資料
適用於:適用於 MySQL 的 Azure 資料庫 - 彈性伺服器
本快速入門示範如何從 Windows、Ubuntu Linux 和 Apple macOS 平台使用以 Go 語言撰寫的程式碼,連線到適用於 MySQL 的 Azure 資料庫。 它會顯示如何使用 SQL 陳述式來查詢、插入、更新和刪除資料庫中的資料。 本主題假設您已熟悉使用 Go 進行開發,但不熟悉適用於 MySQL 的 Azure 資料庫。
必要條件
本快速入門使用在以下任一指南中建立的資源作為起點︰
重要
建議您針對本快速入門使用已啟用公用存取權 (允許的 IP 位址) 的伺服器。 若使用已啟用私人存取權 (VNET 整合) 的伺服器完成本快速入門,可能需要用到未涵蓋的額外步驟。
確保您用於連線的 IP 位址已使用 Azure 入口網站或 Azure CLI 新增伺服器的防火牆規則
安裝 Go 與 MySQL 連接器
在自己的電腦上安裝 Go 和 go-sql-driver for MySQL。 根據您的平台,遵循適當小節中的步驟:
從 [開始] 功能表啟動命令提示字元。
為您的專案產生資料夾,例如
mkdir %USERPROFILE%\go\src\mysqlgo
。將目錄切換到專案資料夾,例如
cd %USERPROFILE%\go\src\mysqlgo
。將 GOPATH 環境變數設定為指向原始程式碼目錄:
set GOPATH=%USERPROFILE%\go
。執行 go mod init,在目前的目錄建立模組。 例如:
go mod init mysqlgo
。- 參數
<module_path>
通常是 GitHub 存放庫內的位置,例如github.com/<your_github_account_name>/<directory>
。 - 您要建立命令列應用程式作為測試,而且不會發佈應用程式時,
<module_path>
不需要參考實際位置。 例如:mysqlgo
。
- 參數
執行
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 mod init mysqlgo go get github.com/go-sql-driver/mysql
取得連線資訊
取得連線到 Azure Database for MySQL 所需的連線資訊。 您需要完整的伺服器名稱和登入認證。
- 登入 Azure 入口網站。
- 從 Azure 入口網站的左側功能表中,按一下 [所有資源],然後搜尋您所建立的伺服器 (例如 mydemoserver)。
- 按一下伺服器名稱。
- 從伺服器的 [概觀] 面板,記下 [伺服器名稱] 和 [伺服器管理員登入名稱]。 如果您忘記密碼,您也可以從此面板重設密碼。
建置並執行 Go 程式碼
- 若要撰寫 Golang 程式碼,您可以使用簡單的文字編輯器,例如 Microsoft Windows 的記事本、Ubuntu 的 vi 或 Nano,或 macOS 的 TextEdit。 如果想要使用更豐富的互動式開發環境 (IDE),可以選擇 Jetbrains 的 Gogland、Microsoft 的 Visual Studio Code,或 Atom。
- 將 Go 程式碼從下列區段貼到文字檔中,然後將它們儲存到專案資料夾中 (副檔名為 *.go),(例如 Windows 路徑
%USERPROFILE%\go\src\mysqlgo\createtable.go
或 Linux 路徑~/go/src/mysqlgo/createtable.go
)。 - 在程式碼中找出
host
、database
、user
和password
常數,然後將範例值取代成您自己的值。 建立適用於 MySQL 的 Azure 資料庫伺服器執行個體時,會建立名為 flexibleserverdb 的資料庫。 您可以使用該資料庫或另一個您建立的資料庫。 - 啟動命令提示字元或 Bash 殼層。 將目錄切換到專案資料夾。 例如,在 Windows 上為
cd %USERPROFILE%\go\src\mysqlgo\
。 在 Linux 上為cd ~/go/src/mysqlgo/
。 提及的部分 IDE 編輯器提供偵錯和執行階段功能,並不需要殼層命令。 - 輸入命令
go run createtable.go
來編譯應用程式並加以執行,以執行程式碼。 - 或者,若要將程式碼建置到原生應用程式
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() 方法來檢查是否在發生錯誤時會緊急結束。
以您自己的值取代 host
、database
、user
和 password
常數。
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
const (
host = "mydemoserver.mysql.database.azure.com"
database = "flexibleserverdb"
user = "myadmin"
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&tls=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() 方法來檢查是否在發生錯誤時會緊急結束。
以您自己的值取代 host
、database
、user
和 password
常數。
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
const (
host = "mydemoserver.mysql.database.azure.com"
database = "flexibleserverdb"
user = "myadmin"
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&tls=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() 方法來檢查是否在發生錯誤時會緊急結束。
以您自己的值取代 host
、database
、user
和 password
常數。
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
const (
host = "mydemoserver.mysql.database.azure.com"
database = "flexibleserverdb"
user = "myadmin"
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&tls=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() 方法來檢查是否在發生錯誤時會緊急結束。
以您自己的值取代 host
、database
、user
和 password
常數。
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
const (
host = "mydemoserver.mysql.database.azure.com"
database = "flexibleserverdb"
user = "myadmin"
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&tls=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