【GO】 2.使用github.com/denisenkom/go-mssqldb操作数据库

  • 一.下载安装github.com/denisenkom/go-mssqldb包

安装需要输入命令:

go get github.com/denisenkom/go-mssqldb

正常情况下输入以上命令就已将包下载并安装完毕

然而这个包有一个依赖包cloud.google.com/go/civil,看到google有没有心头一怔。没错,这个地址GFW墙掉了,所以安装等待一段时间后会出现以下提示:

去包路径下看到github.com/denisenkom/go-mssqldb已经下载下来,由于缺少cloud.google.com/go/civil包所以并没有安装成功。

其实cloud.google.com/go/civil包在github上有相关项目,地址:https://github.com/googleapis/google-cloud-go可以找到

到这里只有曲线救国,我们把github上的这个项目下载下来,然后再gopath的src文件夹中创建cloud.google.com/go目录,再将civil文件夹复制过来,重新安装github.com/denisenkom/go-mssqldb

输入命令go install D:\GoPKG\src\github.com\denisenkom\go-mssqldb

这样这个包就安装好了

  • 二:一个示例程序

package main

import (
	"database/sql"
	"fmt"
	"log"
        "time"

	_ "github.com/denisenkom/go-mssqldb"
)

type Match struct {
	MatchID          int64
	MatchDescription string
	CreatedTime      time.Time
	UpdatedTime      time.Time
	IsDeleted        bool
}

func main() {
	var match Match
	connString := fmt.Sprintf("server=%s;user id=%s;password=%s;database=%s;encrypt=disable",
		"××", "××", "××", "××")

	conn, err := sql.Open("mssql", connString)
	if err != nil {
		log.Fatal("Open connection failed:", err.Error())
	}
    defer conn.Close()

	stmt, err := conn.Prepare(`select top 1 * from tmatch`)
	if err != nil {
		log.Printf("\nPrepare failed:%T %+v\n", err, err)

	}

	row := stmt.QueryRow()
	err = row.Scan(&match.MatchID, &match.MatchDescription, &match.CreatedTime, &match.UpdatedTime, &match.IsDeleted)
	if err != nil {
		log.Fatal("Scan failed:", err.Error())
	}
	fmt.Println(match)
}

注:time日期格式化 time.Time.Format("2006-01-02 15:04:05")其中2006-01-02 15:04:05是固定写法。(简单记为1-2-3-4-5)

  • 三.主键为自增字段时,不要用LastInsertId()方法获取插入的ID

这个包的LastInsertId()方法对sqlserver支持的不是很好,会报There is no generated identity value的错误

官方github readme文件中已经说明这个包对LastInsertId()不支持

当然,插入一条新纪录获取该记录的ID是很重要的,官方也给出了解决办法,在插入语句后面添加返回ID的语句,但这里不要用Exec()方法,个人推荐用QueryRow()方法来实现,代码如下:

func CreateMatch(match entities.Match, db *sql.DB) (int64, error) {
	tsql := fmt.Sprintf("INSERT INTO tMatch(MatchDescription, CreatedTime, UpdatedTime, IsDeleted) VALUES('%s', '%s', '%s', '%s') select ID = convert(bigint, SCOPE_IDENTITY());",
		match.MatchDescription, match.CreatedTime.Format("2006-01-02 15:04:05"), match.UpdatedTime.Format("2006-01-02 15:04:05"), "false")

	row := db.QueryRow(tsql)
	var MatchId int64
	err := row.Scan(&MatchId)
	if err != nil {
		fmt.Println("Error CreateMatch:" + err.Error())
		return -1, err
	}
	return MatchId, nil
}

以上是学习go操作sqlserver数据库过程中遇到的问题

猜你喜欢

转载自blog.csdn.net/chen_peng7/article/details/89317922
go
今日推荐