上面的 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,用法和插入数据里一样。









