golang连接Microsoft MSSQL数据库的驱动插件库gofreetds的使用
golang连接Microsoft MSSQL数据库的驱动插件库gofreetds的使用
gofreetds简介
gofreetds是一个Go语言的FreeTDS封装库,可以作为原生SQL Server数据库驱动程序使用。
主要特性:
- 可作为database/sql驱动使用
- 支持调用存储过程
- 处理多结果集
- 支持数据库镜像
- 连接池
- 将结果集扫描到结构体中
开始使用
安装依赖
首先需要在系统中安装FreeTDS库。
Mac系统安装:
brew install freetds
Ubuntu/Debian系统安装:
sudo apt-get install freetds-dev
安装gofreetds
go get github.com/minus5/gofreetds
作为database/sql驱动使用
驱动名称为"mssql"。
db, err := sql.Open("mssql", connStr)
...
row := db.QueryRow("SELECT au_fname, au_lname name FROM authors WHERE au_id = ?", "172-32-1176")
..
var firstName, lastName string
err = row.Scan(&firstName, &lastName)
完整示例在example/mssql中。
存储过程
gofreetds支持调用存储过程,处理返回值和输出参数,以及处理多结果集。
连接示例:
pool, err := freetds.NewConnPool("user=ianic;pwd=ianic;database=pubs;host=iow")
defer pool.Close()
...
// 获取连接
conn, err := pool.Get()
defer conn.Close()
执行存储过程:
rst, err := conn.ExecSp("sp_help", "authors")
读取存储过程返回值和输出参数:
returnValue := rst.Status()
var param1, param2 int
rst.ParamScan(¶m1, ¶m2)
读取结果集到结构体:
author := &Author{}
rst.Scan(author)
读取下一个结果集:
if rst.NextResult() {
for rst.Next() {
var v1, v2 string
rst.Scan(&v1, &v2)
}
}
完整示例在example/stored_procedure中。
其他用法
执行任意SQL查询:
rst, err := conn.Exec("select au_id, au_lname, au_fname from authors")
执行带参数的SQL查询:
rst, err := conn.ExecuteSql("select au_id, au_lname, au_fname from authors where au_id = ?", "998-72-3567")
完整示例在example/exec中。
Sybase兼容模式
gofreetds支持通过驱动连接Sybase ASE 16.0。要在Sybase ASE服务器上使用Gofreetds,只需在连接字符串上设置兼容模式。
连接字符串参数示例:
Server=myServerAddress;Database=myDatabase;User Id=myUsername;Password=myPassword;Failover Partner=myMirror;Max Pool Size=200;Compatibility Mode=Sybase
测试
测试依赖于pubs数据库。测试和示例使用环境变量GOFREETDS_CONN_STR连接到pubs数据库。
export GOFREETDS_CONN_STR="user=ianic;pwd=ianic;database=pubs;host=iow"
export GOFREETDS_MIRROR_HOST="iow-mirror"
如果不设置数据库镜像测试,可以不定义GOFREETDS_MIRROR_HOST,镜像测试将被跳过。
更多关于golang连接Microsoft MSSQL数据库的驱动插件库gofreetds的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang连接Microsoft MSSQL数据库的驱动插件库gofreetds的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用gofreetds连接Microsoft SQL Server
gofreetds是一个纯Go语言实现的Microsoft SQL Server数据库驱动,它不需要ODBC或其他外部依赖,可以直接连接SQL Server数据库。下面我将详细介绍如何使用gofreetds连接和操作MSSQL数据库。
安装gofreetds
首先需要安装gofreetds包:
go get github.com/minus5/gofreetds
基本连接示例
package main
import (
"fmt"
"github.com/minus5/gofreetds"
)
func main() {
// 创建连接池
pool, err := gofreetds.NewConnPool("server=localhost;database=testdb;user=sa;password=yourpassword")
if err != nil {
panic(err)
}
defer pool.Close()
// 从连接池获取连接
conn, err := pool.Get()
if err != nil {
panic(err)
}
defer conn.Close()
// 执行查询
rst, err := conn.Exec("select * from users where id = ?", 1)
if err != nil {
panic(err)
}
// 处理结果
if len(rst) > 0 && len(rst[0].Rows) > 0 {
row := rst[0].Rows[0]
fmt.Printf("ID: %d, Name: %s\n", row["id"], row["name"])
}
}
连接字符串参数
gofreetds支持以下连接字符串参数:
server
- 服务器地址(可以是IP或主机名)port
- 端口号(默认1433)database
- 数据库名称user
- 用户名password
- 密码mirror
- 镜像服务器地址timeout
- 连接超时(秒)login_timeout
- 登录超时(秒)conn_max
- 连接池最大连接数(默认100)conn_lifetime
- 连接最大生命周期(秒)
执行SQL查询
gofreetds提供了多种执行SQL的方式:
1. 简单查询
rst, err := conn.Exec("select * from products where price > ?", 100)
for _, row := range rst[0].Rows {
fmt.Println(row["name"], row["price"])
}
2. 执行存储过程
rst, err := conn.Exec("exec usp_get_employee ?", 123)
if err != nil {
panic(err)
}
fmt.Println(rst[0].Rows[0]["name"])
3. 执行多个语句
sql := `
select * from users where active = 1;
select * from orders where user_id in (select id from users where active = 1);
`
rst, err := conn.Exec(sql)
// rst[0] 包含第一个查询的结果
// rst[1] 包含第二个查询的结果
事务处理
// 开始事务
tx, err := conn.Begin()
if err != nil {
panic(err)
}
// 执行事务操作
_, err = tx.Exec("update accounts set balance = balance - ? where id = ?", 100, 1)
if err != nil {
tx.Rollback()
panic(err)
}
_, err = tx.Exec("update accounts set balance = balance + ? where id = ?", 100, 2)
if err != nil {
tx.Rollback()
panic(err)
}
// 提交事务
err = tx.Commit()
if err != nil {
panic(err)
}
性能优化建议
-
使用连接池:gofreetds内置连接池,应该重用连接而不是频繁创建和关闭。
-
批量插入:对于大量数据插入,考虑使用批量插入:
sql := "insert into logs (message, created_at) values (?, ?)"
batch := conn.CreateBatch()
for i := 0; i < 1000; i++ {
batch.Add(sql, fmt.Sprintf("log message %d", i), time.Now())
}
_, err := batch.Exec()
- 参数化查询:始终使用参数化查询防止SQL注入。
错误处理
gofreetds返回的错误通常包含详细的SQL Server错误信息:
_, err := conn.Exec("select * from non_existent_table")
if err != nil {
if mssqlErr, ok := err.(*gofreetds.MssqlError); ok {
fmt.Printf("SQL Error: %d, Severity: %d, State: %d, Message: %s\n",
mssqlErr.Number, mssqlErr.Severity, mssqlErr.State, mssqlErr.Message)
} else {
fmt.Printf("Error: %v\n", err)
}
}
高级特性
1. 使用镜像服务器
pool, err := gofreetds.NewConnPool("server=primary;mirror=secondary;database=testdb;user=sa;password=pwd")
2. 设置查询超时
conn.SetQueryTimeout(10) // 10秒超时
3. 获取结果集元数据
rst, _ := conn.Exec("select * from users")
for _, col := range rst[0].Columns {
fmt.Printf("Name: %s, Type: %s\n", col.Name, col.DbType)
}
总结
gofreetds是一个功能齐全且性能良好的纯Go SQL Server驱动,它提供了连接池、事务支持、存储过程调用等关键功能。相比其他需要ODBC的驱动,gofreetds更加轻量级且易于部署。对于大多数Go应用程序与SQL Server的交互需求,gofreetds都是一个不错的选择。
注意在生产环境中使用时应妥善处理错误,使用连接池,并考虑添加适当的重试逻辑以应对网络波动等问题。