在这个快速入门中,你通过 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 项目
创建并初始化一个新目录:
mkdir go-sql-quickstart cd go-sql-quickstart go mod init go-sql-quickstart安装驱动:
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")