-
一.下载安装github.com/denisenkom/go-mssqldb包
安装需要输入命令:
go get github.com/denisenkom/go-mssqldb
正常情况下输入以上命令就已将包下载并安装完毕
然而这个包有一个依赖包cloud.google.com/go/civil,看到google有没有心头一怔。没错,这个地址***墙掉了,所以安装等待一段时间后会出现以下提示:
去包路径下看到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数据库过程中遇到的问题
|
请发表评论