快速入門:使用 go-mssqldb 連接並查詢

在這個快速入門中,你會從 Go 連接到 SQL Server 資料庫並執行查詢。 你使用 go-mssqldb 驅動程式搭配標準 database/sql 套件。

先決條件

本文的主要範例需要:

如果你是連接 Azure SQL 而非本地 SQL Server 實例,請使用 go-mssqldb 搭配 Azure SQL Database 來完成 Azure 專屬的前置條件和設定。

選擇你的起點

本文的主要範例使用了 Windows 上的本地 SQL Server 實例,並整合了認證功能。 如果你使用 Linux 或 macOS,或是連接 Azure SQL,請使用本文後面的 SQL 認證或 Microsoft Entra ID 變體。

  • 如果你想要針對 SQL Server 的最小端對端範例,請繼續閱讀這篇文章,並且你可以建立本地測試資料庫。
  • 如果你使用的是 SQL Server 登入而非 Windows 驗證,請繼續閱讀本文,稍後使用 SQL 認證變體。
  • 如果你要連接 Azure SQL Database、Azure SQL 受控執行個體 或 Fabric 中的 SQL 資料庫,請先從 Use go-mssqldb with Azure SQL Database 開始。 那篇文章涵蓋了 Azure TLS 的要求、連線限制以及無密碼認證。
  • 如果你用的是 Microsoft Entra ID,請匯入github.com/microsoft/go-mssqldb/azuread並使用azuresql驅動程式名稱。 關於憑證流程的詳細資訊,請參見 Microsoft Entra ID 認證

建立 Go 專案

  1. 建立並初始化一個新目錄:

    mkdir go-sql-quickstart
    cd go-sql-quickstart
    go mod init go-sql-quickstart
    
  2. 安裝驅動程式:

    go get github.com/microsoft/go-mssqldb
    

連線並查詢

建立一個以以下 Go 代碼命名 main.go 的檔案:

package main

import (
    "context"
    "database/sql"
    "fmt"
    "log"

    _ "github.com/microsoft/go-mssqldb"
)

func main() {
    // Build the connection string.
    connString := "sqlserver://<server>?database=AdventureWorks2025&trusted_connection=yes"

    // Open and verify the connection.
    db, err := sql.Open("sqlserver", connString)
    if err != nil {
        log.Fatal("Error opening connection: ", err.Error())
    }
    defer db.Close()

    if err = db.PingContext(context.Background()); err != nil {
        log.Fatal("Error pinging database: ", err.Error())
    }
    fmt.Println("Connected to SQL Server.")

    // Run a SELECT query.
    rows, err := db.QueryContext(context.Background(),
        "SELECT DepartmentID, Name, GroupName FROM HumanResources.Department")
    if err != nil {
        log.Fatal("Error running query: ", err.Error())
    }
    defer rows.Close()

    // Iterate through the results.
    fmt.Println("\nDepartments:")
    for rows.Next() {
        var id int
        var name, groupName string
        if err := rows.Scan(&id, &name, &groupName); err != nil {
            log.Fatal("Error scanning row: ", err.Error())
        }
        fmt.Printf("  %d: %s (%s)\n", id, name, groupName)
    }
    if err = rows.Err(); err != nil {
        log.Fatal("Error after row iteration: ", err.Error())
    }
}

執行應用程式:

go run main.go

預期產出:

Connected to SQL Server.

Departments:
  1: Engineering (Research and Development)
  2: Tool Design (Research and Development)
  3: Sales (Sales and Marketing)
  4: Marketing (Sales and Marketing)
  ...

插入一列

將以下函數加入 , main.go 並從 main()中呼叫:

func insertDepartment(db *sql.DB, name, groupName string) (int64, error) {
    ctx := context.Background()
    result, err := db.ExecContext(ctx,
        "INSERT INTO HumanResources.Department (Name, GroupName) VALUES (@p1, @p2)",
        sql.Named("p1", name),
        sql.Named("p2", groupName))
    if err != nil {
        return 0, err
    }
    return result.RowsAffected()
}

Important

驅動 go-mssqldb 程式不支援 LastInsertId()。 呼叫它會回傳錯誤訊息。 使用 OUTPUT 子句或獨立 SELECT SCOPE_IDENTITY() 查詢來取得插入的身份值。

使用 SQL 驗證

若要使用 SQL Server 認證而非 Windows 驗證 連接,請更改 連接字串。 關於所有 連接字串 格式與選項,請參見 Connection strings

connString := "sqlserver://<user>:<password>@<server>:1433?database=AdventureWorks2025"

使用 Microsoft Entra ID

如果你要連接 Azure SQL Database、Azure SQL 受控執行個體 或 Fabric 中的 SQL 資料庫,請先從 Use go-mssqldb with Azure SQL Database 開始。 本節的範例僅顯示在 main.go 中所需的最少程式碼變更。

要使用 Microsoft Entra ID 進行驗證,請匯入以下套件:azuread

import (
    _ "github.com/microsoft/go-mssqldb/azuread"
)

然後使用 azuresql 驅動程式名稱,並將 fedauth 加入連線字串。 關於所有 Microsoft Entra 選項,請參見 Microsoft Entra ID 認證

db, err := sql.Open("azuresql", "sqlserver://<server>.database.windows.net?database=AdventureWorks2025&fedauth=ActiveDirectoryDefault&encrypt=true&TrustServerCertificate=false")