Go中支持MySQL的驱动目前比较多,有如下几种,有些是支持database/sql标准,而有些是采用了自己的 实现接口,常用的有如下几种:
使用实例:
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
func main() {
db, err := sql.Open("mysql", "root:@tcp(localhost:3306)/learn?charset=utf8")
checker(err)
// 插入数据
stmt, err := db.Prepare("insert userinfo set username=?, departname=?, created=?")
checker(err)
res, err := stmt.Exec("mclink", "研发部门", "2020-01-01")
checker(err)
id, err := res.LastInsertId()
checker(err)
fmt.Println(id)
//删除数据
stmt, err = db.Prepare("delete from userinfo where uid=?")
checker(err)
res, err = stmt.Exec(id)
affect, err = res.RowsAffected()
checker(err)
fmt.Println(affect)
}
func checker(err error) {
if err != nil {
fmt.Println(err)
}
}
sql.Open()函数用来打开一个注册过的数据库驱动,go-sql-driver中注册了mysql这个数据库驱动,第二个 参数是DSN(Data Source Name),它是go-sql-driver定义的一些数据库链接和配置信息。它支持如下格 式:
user@unix(/path/to/socket)/dbname?charset=utf8
user:password@tcp(localhost:5555)/dbname?charset=utf8
user:password@/dbname
user:password@tcp([de:ad:be:ef::ca:fe]:80)/dbname
db.Prepare()函数用来返回准备要执行的sql操作,然后返回准备完毕的执行状态。 db.Query()函数用来直接执行Sql返回Rows结果。 stmt.Exec()函数用来执行stmt准备好的SQL语句 我们可以看到我们传入的参数都是=?对应的数据,这样做的方式可以一定程度上防止SQL注入。
package main
import (
"database/sql"
"github.com/astaxie/beedb"
_ "github.com/go-sql-driver/mysql"
"time"
)
// 表结构定义
type UserInfo struct {
Uid int `PK`
Username string
Departname string
Created time.Time
}
func main() {
// 打开连接
db, err := sql .Open("mysql", "root:@tcp(localhost:3306)/learn?charset=utf8")
checker(err)
//创建实例
orm := beedb.New(db, "mysql")
// 插入数据
var saveone UserInfo
saveone.Username = "mclink2"
saveone.Departname = "yanfa"
saveone.Created = time.Now()
_ = orm.Save(&saveone)
// Map 插入数据
add := make(map[string]interface{
})
add["username"] = "aaa"
add["departname"] = "aaa"
add["created"] = time.Now()
_, _ = orm.SetTable("userinfo").Insert(add)
// 插入多条数据
addSlice := make([]map[string]interface{
}, 0)
add1 := make(map[string]interface{
})
add2 := make(map[string]interface{
})
add1["username"] = "www"
add1["deparetname"] = "www"
add1["created"] = time.Now()
add2["username"] = "jjj"
add2["departname"] = "jjj"
add2["created"] = time.Now()
addSlice = append(addSlice, add1, add2)
_, _ = orm.SetTable("userinfo").InsertBatch(addSlice)
}
//更新数据
saveone.Username = "update-name"
saveone.Departname = "udpate-departname"
saveone.Created = time.Now()
_ = orm.Save(&saveone) //saveone有了主键值,则为更新操作
add3 := make(map[string]interface{
})
add3["Username"] = "udpate2-name"
add3["Departname"] = "update3-departname"
_, _ = orm.SetTable("userinfo").SetPK("uid").Where(2).Update(add3)
// 查询数据
var user2 UserInfo
_ = orm.Where("uid=?", 3).Find(&user2)
// 等效于
_ = orm.Where(3).Find(&user2)
var user3 UserInfo
_ = orm.Where("name=? and age ", "mclink", 3).Find(&user3)
//获取多条记录
var users []UserInfo
_ = orm.OrderBy("id").Where("id>?", 1).FindAll(&users)
//获取指定字段的数据
a, _ := orm.SetTable("userinfo").SetPK("uid").Where(2).Select("uid,username").FindMap()
fmt.Println(a)
// 关联查询
b, _ := orm.Join("LEFT", "userdetail", "userinfo.uid=userdeatail.uid").FindMap()
fmt.Println(b)
// 删除单条数据
_, _ = orm.Delete(&saveone)
_, _ = orm.Where("uid = ?", 2).DeleteRow()
// 删除多条数据
_, _ = orm.DeleteAll(&addSlice)
package main
import (
"fmt"
"github.com/astaxie/goredis"
)
func main() {
var client goredis.Client
client.Addr = "127.0.0.1:6379"
_ = client.Set("a", []byte("hello"))
val, _ := client.Get("a")
fmt.Println(string(val))
}