Go之数据库操作

1.MySQL 驱动

Go中支持MySQL的驱动目前比较多,有如下几种,有些是支持database/sql标准,而有些是采用了自己的 实现接口,常用的有如下几种:

  • https://github.com/go-sql-driver/mysql 支持database/sql,全部采用go写。
  • https://github.com/ziutek/mymysql 支持database/sql,也支持自定义的接口,全部采用go写。
  • https://github.com/Philio/GoMySQL 不支持database/sql,自定义接口,全部采用go写。

使用实例:

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注入。

2.使用 beedb 库进行 MySQL orm 开发

2.1 orm 的插入数据操作

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)
}

2.2 更新数据

    //更新数据
	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) 
  • SetPK:显式的告诉ORM,数据库表 userinfo 的主键是 uid 。
  • Where:用来设置条件,支持多个参数,第一个参数如果为整数,相当于调用了Where(“主键=?”,值)。
  • Updata函数接收map类型的数据,执行更新数据。

2.3 查询数据

	// 查询数据
	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)

2.4 删除数据

	// 删除单条数据
	_, _ = orm.Delete(&saveone)
	_, _ = orm.Where("uid = ?", 2).DeleteRow()

	// 删除多条数据
	_, _ = orm.DeleteAll(&addSlice)

3.使用 Redis 操作

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))
}

你可能感兴趣的:(Go大法,go语言,orm)