快速入門:使用 Go 語言連接並查詢 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器的資料

本快速入門示範如何使用以 Go 語言 (golang) 撰寫的程式碼來連線到 適用於 PostgreSQL 的 Azure 資料庫。 它會顯示如何使用 SQL 陳述式來查詢、插入、更新和刪除資料庫中的資料。 這篇文章假設你熟悉使用 Go 的開發,但你是使用 適用於 PostgreSQL 的 Azure 資料庫 的新手。

先決條件

本快速入門會使用 在建立適用於 PostgreSQL 的 Azure 資料庫 中建立的資源作為起點。

這很重要

使用啟用 公開存取(允許 IP 位址) 的伺服器來進行這個快速入門。 若使用已啟用私人存取 (VNET 整合) 的伺服器完成本快速入門,可能需要執行未涵蓋的額外步驟。

請透過 Azure 入口網站或 Azure CLI 確認你連接的 IP 位址已加入伺服器的防火牆規則中。

安裝 Go 和 pq 連接器

在您自己的機器上安裝 Go 和 Pure Go Postgres 驅動程式 (pq)。 根據您的平台,遵循適當的步驟:

  1. 根據安裝指示,下載並安裝 Go for Microsoft Windows。

  2. 從 [開始] 功能表啟動命令提示字元。

  3. 為你的專案建立一個資料夾,例如 mkdir %USERPROFILE%\go\src\postgresqlgo。

  4. 將目錄切換到專案資料夾,例如 cd %USERPROFILE%\go\src\postgresqlgo。

  5. 將 GOPATH 環境變數設定為指向來源程式碼目錄。 set GOPATH=%USERPROFILE%\go。

  6. 執行 go mod init ,在目前目錄下建立模組。 例如: go mod init postgresqlgo 。

    • 參數 <module_path> 通常是 GitHub 存放庫中的位置,例如 github.com/<your_github_account_name>/<directory>.
    • 當您創建命令列應用程式作為測試用途,且不打算發布該應用程式時,<module_path> 不需要指定實際位置。 例如: postgresqlgo 。
  7. 執行 命令來安裝 go get github.com/lib/pq。

    總而言之,就是安裝 Go,然後在命令提示字元中執行下列命令:

    mkdir  %USERPROFILE%\go\src\postgresqlgo
    cd %USERPROFILE%\go\src\postgresqlgo
    set GOPATH=%USERPROFILE%\go
    go mod init postgresqlgo
    go get github.com/lib/pq
    

取得連線資訊

取得連線到 適用於 PostgreSQL 的 Azure 資料庫 所需的連線資訊。 你需要完整合格的伺服器名稱和認證憑證。

  1. 登入 Azure 入口網站。
  2. 在 Azure 入口網站的左側選單中,選擇 「所有資源」,然後搜尋你建立的伺服器(例如 mydemoserver)。
  3. 選取伺服器名稱。
  4. 從伺服器的 [概觀] 面板,記下 [伺服器名稱] 和 [伺服器管理員登入名稱]。 如果您忘記密碼,您也可以從此面板重設密碼。

建置並執行 Go 程式碼

  1. 撰寫圍棋程式碼時,可以使用純文字編輯器,例如Microsoft Windows的 Notepad、Ubuntu 的 Nano,或 macOS 的 TextEdit。 如果你偏好更豐富的互動開發環境(IDE),可以試試 JetBrains 的 GoLand、Microsoft 的 Visual Studio Code 或 Atom。
  2. 將以下章節的 Go 程式碼貼到文字檔中,並以副檔名 *.go 儲存到專案資料夾中,例如 Windows 路徑或 Linux 路徑%USERPROFILE%\go\src\postgresqlgo\createtable.go~/go/src/postgresqlgo/createtable.go。
  3. 在程式碼中找出 HOST、DATABASE、USER 和 PASSWORD 常數,然後將範例值換成您自己的值。 當你建立 適用於 PostgreSQL 的 Azure 資料庫 伺服器時,你建立一個名為 postgres 的資料庫。 你可以使用那個資料庫,或是你自己建立的其他資料庫。
  4. 啟動命令提示字元或 bash 殼層。 將目錄切換到專案資料夾。 例如,在 Windows 上,請使用 cd %USERPROFILE%\go\src\postgresqlgo\。 在 Linux 上,請使用 cd ~/go/src/postgresqlgo/. 提及的部分 IDE 環境提供偵錯和執行階段功能,並不需要殼層命令。
  5. 輸入命令 go run createtable.go 來編譯應用程式並加以執行,以執行程式碼。
  6. 或者,若要將程式碼建置為原生應用程式,請使用 go build createtable.go。 然後啟動 createtable.exe 應用程式。

連線及建立資料表

請使用以下程式碼連接並建立資料表,方法是使用 CREATE TABLE SQL 陳述式,接著 INSERT INTO SQL 語句來新增資料列。

程式碼會匯入三個封裝:sql 套件、pq 封裝 會作為驅動程式來與 PostgreSQL 伺服器通訊,而 fmt 封裝會用於命令列上的列印輸入和輸出。

程式碼會呼叫方法 sql.Open() 連線至 適用於 PostgreSQL 的 Azure 資料庫 資料庫,並使用方法 db.Ping() 檢查連線。 資料庫控制代碼會到處使用,並保留資料庫伺服器的連線集區。 程式碼會呼叫 Exec() 方法數次以執行數個 SQL 命令。 每次都會有一個自訂的 checkError() 方法檢查是否有錯誤發生,並在發生錯誤時緊急退出。

以您自己的值取代 HOST、DATABASE、USER 和 PASSWORD 參數。

package main

import (
	"database/sql"
	"fmt"
	_ "github.com/lib/pq"
)

const (
	// Initialize connection constants.
	HOST     = "mydemoserver.postgres.database.azure.com"
	DATABASE = "postgres"
	USER     = "mylogin"
	PASSWORD = "<server_admin_password>"
)

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

func main() {
	// Initialize connection string.
	var connectionString string = fmt.Sprintf("host=%s user=%s password=%s dbname=%s sslmode=require", HOST, USER, PASSWORD, DATABASE)

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

	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.
	sql_statement := "INSERT INTO inventory (name, quantity) VALUES ($1, $2);"
	_, err = db.Exec(sql_statement, "banana", 150)
	checkError(err)
	_, err = db.Exec(sql_statement, "orange", 154)
	checkError(err)
	_, err = db.Exec(sql_statement, "apple", 100)
	checkError(err)
	fmt.Println("Inserted 3 rows of data")
}

讀取資料

使用下列程式碼搭配 SELECT SQL 陳述式來連線和讀取資料。

程式碼會匯入三個封裝:sql 套件、pq 封裝 會作為驅動程式來與 PostgreSQL 伺服器通訊,而 fmt 封裝會用於命令列上的列印輸入和輸出。

程式碼呼叫方法 sql.Open() 來連線至 適用於 PostgreSQL 的 Azure 資料庫 資料庫,並使用方法 db.Ping() 檢查連線。 資料庫控制代碼會到處使用,並保留資料庫伺服器的連線集區。 select 查詢是透過呼叫方法 資料庫來執行。Query(),產生的列會被保存在一個型別為 列的變數中。 程式碼會使用方法 rows.Scan() 讀取目前資料列中的資料行值,並使用迭代器 rows.Next() 逐列迴圈處理,直到沒有更多資料列為止。 每列的欄位數值會印在控制台上。 每次都會使用自訂的 checkError() 方法檢查是否有錯誤發生,並在發生錯誤時緊急退出。

以您自己的值取代 HOST、DATABASE、USER 和 PASSWORD 參數。

package main

import (
	"database/sql"
	"fmt"
	_ "github.com/lib/pq"
)

const (
	// Initialize connection constants.
	HOST     = "mydemoserver.postgres.database.azure.com"
	DATABASE = "postgres"
	USER     = "mylogin"
	PASSWORD = "<server_admin_password>"
)

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

func main() {

	// Initialize connection string.
	var connectionString string = fmt.Sprintf("host=%s user=%s password=%s dbname=%s sslmode=require", HOST, USER, PASSWORD, DATABASE)

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

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

	// Read rows from table.
	var id int
	var name string
	var quantity int

	sql_statement := "SELECT * from inventory;"
	rows, err := db.Query(sql_statement)
	checkError(err)
	defer rows.Close()

	for rows.Next() {
		switch err := rows.Scan(&id, &name, &quantity); err {
		case sql.ErrNoRows:
			fmt.Println("No rows were returned")
		case nil:
			fmt.Printf("Data row = (%d, %s, %d)\n", id, name, quantity)
		default:
			checkError(err)
		}
	}
}

更新資料

使用下列程式碼搭配 UPDATE SQL 陳述式來連線和更新資料。

程式碼會匯入三個套件:sql 套件、pq 套件作為驅動程式來與 Postgres 伺服器通訊,以及 fmt 套件 (適用於命令列上列印的輸入和輸出)。

程式碼呼叫方法 sql.Open() 來連線到 適用於 PostgreSQL 的 Azure 資料庫 資料庫,並使用方法 db.Ping() 檢查連線。 資料庫控制代碼會到處使用,並保留資料庫伺服器的連線集區。 程式碼會呼叫 Exec() 方法來執行可更新資料表的 SQL 陳述式。 使用自訂 checkError() 方法檢查是否發生錯誤,一旦發生錯誤即會緊急結束。

以您自己的值取代 HOST、DATABASE、USER 和 PASSWORD 參數。

package main

import (
  "database/sql"
  _ "github.com/lib/pq"
  "fmt"
)

const (
	// Initialize connection constants.
	HOST     = "mydemoserver.postgres.database.azure.com"
	DATABASE = "postgres"
	USER     = "mylogin"
	PASSWORD = "<server_admin_password>"
)

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

func main() {

	// Initialize connection string.
	var connectionString string = 
		fmt.Sprintf("host=%s user=%s password=%s dbname=%s sslmode=require", HOST, USER, PASSWORD, DATABASE)

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

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

	// Modify some data in table.
	sql_statement := "UPDATE inventory SET quantity = $2 WHERE name = $1;"
	_, err = db.Exec(sql_statement, "banana", 200)
	checkError(err)
	fmt.Println("Updated 1 row of data")
}

刪除資料

請使用以下程式碼連接資料庫並使用 DELETE SQL 陳述式刪除資料。

程式碼會匯入三個套件:sql 套件、pq 套件作為驅動程式來與 Postgres 伺服器通訊,以及 fmt 套件 (適用於命令列上列印的輸入和輸出)。

程式碼會呼叫方法 sql.Open() 來連線到 適用於 PostgreSQL 的 Azure 資料庫,並使用方法 db.Ping() 來檢查連線。 資料庫控制保存著資料庫伺服器的連線集區,並在整個過程中使用。 程式碼會呼叫 Exec() 方法,來執行從資料表中刪除資料列的 SQL 陳述式。 自訂 checkError() 方法會檢查是否發生錯誤,若發生錯誤則退出。

以您自己的值取代 HOST、DATABASE、USER 和 PASSWORD 參數。

package main

import (
  "database/sql"
  _ "github.com/lib/pq"
  "fmt"
)

const (
	// Initialize connection constants.
	HOST     = "mydemoserver.postgres.database.azure.com"
	DATABASE = "postgres"
	USER     = "mylogin"
	PASSWORD = "<server_admin_password>"
)

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

func main() {

	// Initialize connection string.
	var connectionString string = 
		fmt.Sprintf("host=%s user=%s password=%s dbname=%s sslmode=require", HOST, USER, PASSWORD, DATABASE)

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

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

	// Delete some data from table.
	sql_statement := "DELETE FROM inventory WHERE name = $1;"
	_, err = db.Exec(sql_statement, "orange")
	checkError(err)
	fmt.Println("Deleted 1 row of data")
}

清理資源

若要清除本快速入門期間使用的所有資源,請使用下列命令刪除資源群組:

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