golang连接Microsoft MSSQL数据库驱动插件库gofreetds的使用
golang连接Microsoft MSSQL数据库驱动插件库gofreetds的使用
gofreetds介绍
Go FreeTDS封装库,是原生的SQL Server数据库驱动。
主要特性:
- 可以作为database/sql驱动使用
- 支持调用存储过程
- 支持处理多结果集
- 支持数据库镜像
- 连接池
- 支持将结果集扫描到结构体
开始使用
安装依赖
系统需要安装FreeTDS库。
Mac系统:
brew install freetds
Ubuntu/Debian系统:
sudo apt-get install freetds-dev
安装Go包
go get github.com/minus5/gofreetds
文档
参考官方文档:http://godoc.org/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")
结果集(rst)是结果数组。每个结果包含Columns和Rows数组。每行是值数组,每列是ResultColumn对象数组。
完整示例在example/exec中。
带参数的查询:
rst, err := conn.ExecuteSql("select au_id, au_lname, au_fname from authors where au_id = ?", "998-72-3567")
Sybase兼容模式
gofreetds支持通过驱动连接Sybase ASE 16.0。要使用此功能,需要在连接字符串中设置兼容模式参数。
连接字符串参数
可以使用以下参数名指定Sybase兼容模式:
- ‘compatibility’
- ‘compatibility mode’
- ‘compatibility_mode’
- ‘Compatibility Mode’
当前模式仅支持Sybase,可以指定为’sybase’或’Sybase’。
示例连接字符串:
Server=myServerAddress;Database=myDatabase;User Id=myUsername;Password=myPassword;Failover Partner=myMirror;Max Pool Size=200;Compatibility Mode=Sybase
测试
测试依赖于pubs数据库。可以通过Microsoft下载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数据库的第三方驱动库,它基于FreeTDS实现。下面我将详细介绍如何使用gofreetds连接和操作MSSQL数据库。
安装gofreetds
首先需要安装gofreetds库:
go get github.com/minus5/gofreetds
基本连接示例
package main
import (
"fmt"
"log"
"github.com/minus5/gofreetds"
)
func main() {
// 配置连接参数
connStr := "user=sa;password=your_password;server=localhost;database=your_database"
// 创建连接池
pool, err := gofreetds.NewConnPool(connStr)
if err != nil {
log.Fatal(err)
}
defer pool.Close()
// 从连接池获取连接
conn, err := pool.Get()
if err != nil {
log.Fatal(err)
}
defer conn.Close()
// 执行查询
rst, err := conn.Exec("select * from users where id = ?", 1)
if err != nil {
log.Fatal(err)
}
// 处理结果
for _, row := range rst[0].Rows {
fmt.Printf("ID: %d, Name: %s\n", row.Int("id"), row.String("name"))
}
}
连接参数说明
连接字符串支持的参数:
user
或username
: 数据库用户名password
或pwd
: 数据库密码server
或host
: 服务器地址database
或db
: 数据库名称port
: 端口号(默认1433)mirror
: 镜像服务器地址timeout
: 连接超时(秒)encrypt
: 是否加密(disable/require)tls
: TLS配置
执行SQL查询
查询单行
func querySingleRow(conn *gofreetds.Conn) {
rst, err := conn.Exec("select top 1 * from users where age > ?", 18)
if err != nil {
log.Fatal(err)
}
if len(rst) > 0 && len(rst[0].Rows) > 0 {
row := rst[0].Rows[0]
fmt.Printf("User: %s, Age: %d\n", row.String("name"), row.Int("age"))
}
}
查询多行
func queryMultipleRows(conn *gofreetds.Conn) {
rst, err := conn.Exec("select * from products where price > ?", 100)
if err != nil {
log.Fatal(err)
}
for _, row := range rst[0].Rows {
fmt.Printf("Product: %s, Price: %.2f\n",
row.String("name"),
row.Float64("price"))
}
}
执行存储过程
func callStoredProcedure(conn *gofreetds.Conn) {
rst, err := conn.Exec("exec usp_get_employee_by_id ?", 123)
if err != nil {
log.Fatal(err)
}
for _, row := range rst[0].Rows {
fmt.Printf("Employee: %s %s\n",
row.String("first_name"),
row.String("last_name"))
}
}
事务处理
func transactionExample(conn *gofreetds.Conn) {
// 开始事务
tx, err := conn.Begin()
if err != nil {
log.Fatal(err)
}
// 确保事务回滚或提交
defer func() {
if err != nil {
tx.Rollback()
return
}
tx.Commit()
}()
// 执行事务中的SQL
_, err = tx.Exec("update accounts set balance = balance - ? where id = ?", 100, 1)
if err != nil {
return
}
_, err = tx.Exec("update accounts set balance = balance + ? where id = ?", 100, 2)
if err != nil {
return
}
fmt.Println("Transaction completed successfully")
}
使用连接池
gofreetds内置了连接池功能,可以高效管理数据库连接:
func connectionPoolExample() {
// 创建连接池
pool, err := gofreetds.NewConnPool("user=sa;password=123;server=localhost;database=test")
if err != nil {
log.Fatal(err)
}
defer pool.Close()
// 设置连接池参数
pool.SetMaxOpenConns(10) // 最大连接数
pool.SetMaxIdleConns(5) // 最大空闲连接数
// 从连接池获取连接
conn, err := pool.Get()
if err != nil {
log.Fatal(err)
}
defer conn.Close()
// 使用连接执行查询
_, err = conn.Exec("select * from users")
if err != nil {
log.Fatal(err)
}
}
性能注意事项
- 尽量使用连接池而不是频繁创建新连接
- 对于大量数据的查询,考虑使用分页
- 复杂的查询可以转换为存储过程提高性能
- 使用参数化查询而不是字符串拼接,防止SQL注入
错误处理
gofreetds返回的错误通常包含详细的SQL Server错误信息:
func errorHandlingExample(conn *gofreetds.Conn) {
_, err := conn.Exec("select * from non_existent_table")
if err != nil {
if mssqlErr, ok := err.(*gofreetds.SqlError); ok {
fmt.Printf("SQL Error: %d, State: %d, Message: %s\n",
mssqlErr.Number,
mssqlErr.State,
mssqlErr.Message)
} else {
fmt.Printf("Other error: %v\n", err)
}
}
}
gofreetds是一个功能齐全的MSSQL驱动,适合大多数Go应用程序与SQL Server交互的需求。对于更高级的需求,也可以考虑官方支持的go-mssqldb
驱动。