golang 每日一练 使用mysql进行简单查询

golang本身没有提供连接MySQL的驱动,但是定义了标准接口供第三方开发驱动。这里连接mysql可以使用第三方库,第三方库推荐使用 https://github.com/Go-SQL-Driver/MySQL


下载驱动:

sudo go get github.com/go-sql-driver/mysql


创建表:

CREATE TABLE `mytest1` (

  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',

  `name` varchar(32) NOT NULL DEFAULT '',

  PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8


代码:

package main

import (
_ "github.com/go-sql-driver/mysql"
      "database/sql"
      "fmt"
      "log"
)

func NewMydb() *Mydb {
db,err := sql.Open("mysql","root:123456@tcp(127.0.0.1:3306)/test?charset=utf8")
if err != nil {
log.Println("fail to open database:",err.Error())
return new(Mydb)
}
return &Mydb{db:db}
}

type Mydb struct {
db *sql.DB
}


type Mytest1 struct {
Id int
      Name string
}

/*
  获得多行记录
*/
func (m *Mydb) GetRows(sqlStr string) *[]Mytest1{
row,err := m.db.Query(sqlStr)
var table []Mytest1
var one Mytest1
if err != nil {
log.Println(err)
return &table
}
for row.Next() {
row.Scan(&one.Id,&one.Name)
table = append(table,one)
}

return &table
}

/*
 获得多行记录
*/
func (m *Mydb) GetRow(sqlStr string) *Mytest1{
row := m.db.QueryRow(sqlStr)
table := new(Mytest1)
//匹配到 mytest1 中
      err := row.Scan(&table.Id,&table.Name)
if err != nil {
log.Println(err)
return new(Mytest1)
}
return table
}

/*
 执行 更新,插入,删除语句
*/
func (m *Mydb) Exec(sqlStr string) int64  {
result,err := m.db.Exec(sqlStr)
if err != nil {
log.Println("exce fail:",err)
return 0
      }
//获得影响行数
      num,err := result.RowsAffected()
if err != nil {
log.Println("exce fail:",err)
}
return num
}

func (m *Mydb) Close() error {
return m.db.Close()
}



func main() {
mydbObj := NewMydb()
defer mydbObj.Close()
num1 := mydbObj.Exec("INSERT into mytest1(name) VALUES ('a')")
num1 = num1 + mydbObj.Exec("INSERT into mytest1(name) VALUES ('b')")
fmt.Println(num1)

row := mydbObj.GetRow("SELECT * FROM mytest1")
fmt.Println(row)
rows := mydbObj.GetRows("SELECT * FROM mytest1")
fmt.Println(rows)

mydbObj.Exec("DELETE FROM mytest1")
}



上面例子代码实现了,查询单行,多行和增删改。

但是在查询那里绑定数据到type还不是特别方便,还需要改进

在线交流