sqlx是一个第三方库,它为database/sql包提供了一系列非常有用的扩展功能。
因为sqlx和database/sql包使用的是相同的接口,所以sqlx能够很好地兼容使用database/sql包的程序, 除此之外,sqlx还提供了以下这些额外的功能:
- 通过结构标签(struct tag)将数据库记录(即行)封装为结构、映射或者切片;
- 为预处理语句提供具名参数支持。
表结构
create table blog
(
id int auto_increment
primary key,
title varchar(255) not null,
content text not null,
creator_id int not null
);
示例
package main
import (
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
)
type Blog struct {
Id int
Title string
Content string
// 当属性与字段名不一致时,使用 struct_tag 进行映射
Creator int `db:"creator_id"`
}
var db *sqlx.DB
func init(){
var err error
db, err = sqlx.Open("mysql","esns:dccmmtop@tcp(192.168.32.128:3306)/chitchat?parseTime=true")
if err != nil {
panic(err)
}
}
func (blog *Blog)save(){
result, err := db.Exec("insert into blog(title, content, creator_id) values (?,?,?)",blog.Title,blog.Content, blog.Creator)
if err != nil {
panic(err)
}
// mysql 不支持返回插入后的自增Id,需要额外处理
id, err := result.LastInsertId()
if err != nil {
panic(err)
}
blog.Id = int(id)
return
}
func findById(id int)(blog Blog){
blog = Blog{}
// StructScan 会自动赋值属性
err := db.QueryRowx("select id, title, content, creator_id from blog where id = ?", id).StructScan(&blog)
if err != nil {
panic(err)
}
return
}
func main(){
blog := Blog{
Title: "go语言学习",
Content: "开启go编程之旅吧",
Creator: 1,
}
blog.save()
blog = findById(blog.Id)
fmt.Printf("blog: %v\n", blog)
}