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(&param1, &param2)

读取结果集到结构体:

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

1 回复

更多关于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)
}

性能优化建议

  1. 使用连接池:gofreetds内置连接池,应该重用连接而不是频繁创建和关闭。

  2. 批量插入:对于大量数据插入,考虑使用批量插入:

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()
  1. 参数化查询:始终使用参数化查询防止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都是一个不错的选择。

注意在生产环境中使用时应妥善处理错误,使用连接池,并考虑添加适当的重试逻辑以应对网络波动等问题。

回到顶部