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(&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")

结果集(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

1 回复

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

连接参数说明

连接字符串支持的参数:

  • userusername: 数据库用户名
  • passwordpwd: 数据库密码
  • serverhost: 服务器地址
  • databasedb: 数据库名称
  • 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)
	}
}

性能注意事项

  1. 尽量使用连接池而不是频繁创建新连接
  2. 对于大量数据的查询,考虑使用分页
  3. 复杂的查询可以转换为存储过程提高性能
  4. 使用参数化查询而不是字符串拼接,防止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驱动。

回到顶部