go基础之数据库CRUD

我们以postgres数据库为例,讲讲go如何使用sql进行操作数据库,假设已经装好postgres库,用户名密码都为root,数据库名为pq。表名为person,字段有id和name。

首先安装驱动包

go get "​​github.com/lib/pq​​"

"database/sql"  

_ "github.com/lib/pq"

需要导入上面2个包,导入pq包是为了注册postgres驱动,实际上不需要调用里面的方法,所以使用_ "github.com/lib/pq",包内定义的init函数会被调用,并对其自身进行注册。

获取数据库句柄Db

var Db *sql.DB

func init() {
var err error
Db, err = sql.Open("postgres", "user=root dbname=person password=root sslmode=disable")
if err != nil {
panic(err)
}
}

sql.DB结构是一个数据库句柄,代表的是一个包含任意多个数据库连接的连接池。调用Open函数,并将相应的用户名密码和数据库传入进去。Open函数在调用是并不会真正地与数据库进行连接,也不会检查提供参数的正确还是错误,真正的作用是设置好连接数据库所需的各个结构,并以惰性的方式,等到真正需要时才建立相应的数据库连接。

插入操作

type Person struct {
Id int
Name string
}
person := Person{Name: "小明"}
statement := "insert into posts(name) values($1) returning id"
stmt, err := Db.Prepare(statement)
if err != nil {
return
}
defer stmt.Close()
err = stmt.QueryRow(person.Name).Scan(&person.Id)

sql的参数值使用$1来代替,如果有2个,就是$1,$2,后面的returning id是要求数据库插入完成后返回id的值。使用QueryRow方法,并传入需要的参数。因为我们只想获取一个只想sql.Row结构的引用,如果返回多与一个sql.Row,name只会返回结果中的第一个,并丢弃剩余的。通过Scan方法把返回的值赋予参数,上面的sql返回插入后的id,并赋予person.Id。

根据id查询数据

person = Person{}
err = Db.QueryRow("select id ,name from person where id=$1", id).Scan(&person.Id, &person.Name)

跟上面的插入基本一样,只不过sql直接放入QueryRow中,获取到的值通过Scan传入参数。

更新操作

_, err = Db.Exec("update person set name = $2 where id = $1", person.Id, person.Name)

直接调用Db的Exec方法进行更新,因为对更新操作的返回值不感兴趣,所以使用_进行忽略。

删除

_, err = Db.Exec("delete from person where id = $1", person.Id)

查询多条数据

rows, err := Db.Query("select id,name from person limit 10")
if err != nil {
return
}
for rows.Next() {
person := Person{}
err = rows.Scan(&person.Id, &person.Name)
if err != nil {
return
}
fmt.Println(person)
}
rows.Close()
发表评论

相关文章