在 Go 语言的开发过程中,与 Microsoft SQL Server (MSSQL) 数据库的交互是常见需求之一。本文将详细介绍如何使用 Go 语言高效、安全地连接 SQL Server,并进行基本的 CRUD(增删改查)操作。
1. 安装 MSSQL 驱动
Go 语言使用 github.com/denisenkom/go-mssqldb
作为 SQL Server 驱动,首先需要安装它:
go
go get -u github.com/denisenkom/go-mssqldb
2. 连接 MSSQL 数据库
在 Go 代码中,使用 database/sql
包结合 go-mssqldb
进行数据库连接。
go
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/denisenkom/go-mssqldb"
)
func main() {
// 配置 SQL Server 连接信息
server := "localhost"
port := 1433
user := "sa"
password := "your_password"
database := "your_db"
dsn := fmt.Sprintf("server=%s;port=%d;user id=%s;password=%s;database=%s;encrypt=disable",
server, port, user, password, database)
db, err := sql.Open("sqlserver", dsn)
if err != nil {
log.Fatal(err)
}
defer db.Close()
// 测试连接
if err := db.Ping(); err != nil {
log.Fatal(err)
}
fmt.Println("成功连接到 MSSQL 数据库!")
}
3. 执行 SQL 查询
插入数据
css
query := "INSERT INTO users (name, age) VALUES (@p1, @p2)"
result, err := db.Exec(query, "李四", 30)
if err != nil {
log.Fatal(err)
}
lastInsertID, _ := result.LastInsertId()
fmt.Println("插入成功,ID:", lastInsertID)
查询数据
go
query := "SELECT id, name, age FROM users WHERE age > @p1"
rows, err := db.Query(query, 25)
if err != nil {
log.Fatal(err)
}
defer rows.Close()
for rows.Next() {
var id int
var name string
var age int
err := rows.Scan(&id, &name, &age)
if err != nil {
log.Fatal(err)
}
fmt.Printf("ID: %d, Name: %s, Age: %d\n", id, name, age)
}
4. 连接池优化
在高并发场景下,合理配置数据库连接池参数可以提升性能。
scss
db.SetMaxOpenConns(100) // 最大打开连接数
db.SetMaxIdleConns(10) // 最大空闲连接数
db.SetConnMaxLifetime(60 * time.Second) // 连接最大存活时间
5. 事务处理
scss
tx, err := db.Begin()
if err != nil {
log.Fatal(err)
}
_, err = tx.Exec("UPDATE accounts SET balance = balance - @p1 WHERE id = @p2", 100, 1)
if err != nil {
tx.Rollback()
log.Fatal(err)
}
_, err = tx.Exec("UPDATE accounts SET balance = balance + @p1 WHERE id = @p2", 100, 2)
if err != nil {
tx.Rollback()
log.Fatal(err)
}
tx.Commit()
fmt.Println("事务提交成功!")
6. 结论
本文介绍了 Go 语言连接 MSSQL 数据库的完整流程,包括驱动安装、基本 CRUD 操作、连接池优化和事务处理等。希望能帮助你更高效地使用 Go 进行 SQL Server 数据库开发!