Go语言中http和mysql的实现代码

2020-01-28 13:43:47刘景俊

上面的 values(?,?,?) 里的问号,是占位符,具体的值可以写在后面的参数里。当然如果不用占位符,直接就传1个字符串作为参数也是可以的。

查询

查询单个字段:


func query() {
  row := DB.QueryRow("select username from person where user_id=?", 1)
  var name string // 创建变量用于存放查询到的数据
  if err := row.Scan(&name); err != nil {
    fmt.Println("Scan Failed:", err)
    return
  }
  fmt.Println(name)
}

func main() {
  query()
}

也可以一次查询多个字段或所有字段,查询之前按照表的类型创建结构体,用查询到的数据为结构体赋值:


type Person struct {
  ID int `db:"user_id"`
  Username sql.NullString `db:"username"`
  Gender sql.NullString `db:"gender"`
  Email sql.NullString `db:"email"`
}

func query() {
  row := DB.QueryRow("select * from person where user_id=?", 6)
  var person = new(Person)
  // row.scan中的字段必须是按照数据库存入字段的顺序,否则报错
  if err := row.Scan(&person.ID, &person.Username, &person.Gender, &person.Email); err != nil {
    fmt.Println("Scan Failed:", err)
    return
  }
  fmt.Println(person)
}

func main() {
  query()
}


数据模型,就是上面定义的结构体。这里的类型可以是Go的标准数据类型。但是如果数据库的字段允许为空,并且该字段的值也为空,那么查询后该字段会返回nil。如果是string类型,则无法接收nil,但sql.NullString则可以接收nil值。

另外,结构体里的tag标签在这里没有意义。不过上面的tag标注了该字段在数据库里对应的字段名,可能在别处会有用。

查询多行


func query() {
  rows, err := DB.Query("select * from person where user_id > ?", 1)
  defer func() {
    if rows != nil {
      rows.Close()
    }
  }()
  if err != nil {
    fmt.Println("Query 查询 ERROR:", err)
    return
  }
  var person = new(Person)
  for rows.Next() {
    if err = rows.Scan(&person.ID, &person.Username, &person.Gender, &person.Email); err != nil {
      fmt.Println("Scan Failed:", err)
      return
    }
    fmt.Println(person)
  }
}

func main() {
  query()
}


查询用起来还是不太方法,不过还可以选择其他第三方库,那里会有一些很好的扩展。后面会举例。

其他操作

由于基本都是用SQL的命令进行操作,所以其他操作就不一个一个举例了

update 更新数据


result, err := DB.Exec("UPDATE person set email=? where username=?", "Cara", Cara@catco.org)

delete 删除数据


result,err := DB.Exec("DELETE FROM person where id=?",1)

注意:更新数据不返回LastInsertID,所以result.LastInsertID一直为0。删除数据可以拿到LastInsertID,用法和插入数据里一样。