快速入门:使用 go-mssqldb 进行连接和查询

在这个快速入门中,你通过 Go 连接到 SQL Server 数据库并运行查询。 您使用的是标准 go-mssqldb 软件包附带的 database/sql 驱动程序。

先决条件

对于本文中的主要示例,你需要:

  • 1.25或更高
  • 访问兼容SQL Server的端点。 主要示例假设 Windows 上的本地 SQL Server 实例。
  • AdventureWorks2025 示例数据库。 有关下载和恢复说明,请参见 AdventureWorks示例数据库

如果你连接的是 Azure SQL 而不是本地 SQL Server 实例,建议使用 go-mssqldb 配合 Azure SQL 数据库 来满足 Azure 特有的前置条件和设置。

选择起点

本文的主要示例使用了Windows上的本地SQL Server实例,并集成了认证功能。 如果你在Linux或macOS上,或者连接Azure SQL,请使用本文后面的SQL认证或Microsoft Entra ID变体。

  • 如果你想要针对SQL Server的最小端到端样本,可以继续阅读本文,并创建本地测试数据库。
  • 如果你使用的是 SQL Server 登录而不是 Windows 身份验证,请继续阅读本文,并在稍后使用 SQL 身份验证版本。
  • 如果你要连接到 Azure SQL 数据库、Azure SQL 托管实例 或 Fabric 中的 SQL 数据库,请先参阅 将 go-mssqldb 与 Azure SQL 数据库 配合使用。 那篇文章涵盖了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
    

连接并查询

创建一个名为 main.go 的文件,并写入以下 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 数据库、Azure SQL 托管实例 或 Fabric 中的 SQL 数据库,请先参阅 将 go-mssqldb 与 Azure SQL 数据库 配合使用。 本节示例仅展示了中 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")