准备阶段
在这里不多赘述,库表的建立参考菜鸟教程pgsql
引入github库
在这里有三个比较好的库
https://github.com/jmoiron/sqlx
https://github.com/lib/pq
https://github.com/jinzhu/gorm
第三个库功能比较强大,暂时用不到,这里使用前两个库构建
go get -t https://github.com/jmoiron/sqlx
go get -t https://github.com/lib/pq
实际demo
package mainimport ("database/sql""fmt""github.com/jmoiron/sqlx"_ "github.com/lib/pq""log"
)/**
1.创建模式PostgreSQL 模式(SCHEMA)可以看着是一个表的集合。一个模式可以包含视图、索引、据类型、函数和操作符等。相同的对象名称可以被用于不同的模式中而不会出现冲突,例如 schema1 和 myschema 都可以包含名为 mytable 的表。使用模式的优势:允许多个用户使用一个数据库并且不会互相干扰。将数据库对象组织成逻辑组以便更容易管理。第三方应用的对象可以放在独立的模式中,这样它们就不会与其他对象的名称发生冲突。模式类似于操作系统层的目录,但是模式不能嵌套。*/var schema = `create table person(first_name text,last_name text,email text);create table place(country text,city text null, telcode integer)
`type Person struct {FirstName string `db:"first_name"`LastName string `db:"last_name"`Email string `db:"email"`
}type Place struct{Country string `db:"country"`City sql.NullString `db:"city"` //该字段允许为空TelCode int `db:"telcode"`
}func main(){/**1.连接数据库port是数据库的端口号,默认是5432,如果改了,这里一定要自定义;user就是你数据库的登录帐号;dbname就是你在数据库里面建立的数据库的名字;sslmode就是安全验证模式;*/db,err:=sqlx.Connect("postgres","user=zonst port=5432 dbname=mydb sslmode=disable")checkErr(err)//2.事务操作测试//MutiExec(db)//3.查询操作测试//selectTest(db)//4.插入操作测试//insertTest(db)//5.更新操作测试//updateTest(db)//6.删除操作测试//deleteTest(db)//8.关闭数据库close(db)}/**
事务操作*/
func MutiExec(db *sqlx.DB){//1.创建数据库表,如果你之前已经创建了,再次运行则会报错//db.MustExec(schema)//2.开启事务插入数据,事务执行中只要有一条语句出问题,数据就会回滚tx:=db.MustBegin()tx.MustExec("insert into person(first_name,last_name,email) values ($1,$2,$3)","11","11","111")tx.MustExec("insert into person(first_name,last_name,email) values ($1,$2,$3)","22","22","222")tx.MustExec("insert into person(first_name,last_name,email) values ($1,$2,$3)","33","33","333")tx.MustExec("insert into place(country,city,telcode) values ($1,$2,$3)","44","44","444")tx.MustExec("insert into place(country,city,telcode) values ($1,$2,$3)","55","55","555")//3.另外一种方法,直接以结构体的形式插入数据tx.NamedExec("insert into person(first_name,last_name,email) values (:first_name,:last_name,:email)",&Person{FirstName: "jamess",LastName: "vincent",Email: "123@qq.com",})//提交事务tx.Commit()
}/**
查询操作*/
func selectTest(db *sqlx.DB){//执行sql语句,并且使用结构体数组来保存返回的结果集合var err errorperson:=[]Person{}db.Select(&person,"select * from person order by first_name asc")for r:=0;r< len(person);r++{fmt.Println(person[r])}places := []Place{}err = db.Select(&places,"select * from place order by telcode asc") //字典序升序排序checkErr(err)for r:=0;r<len(places);r++{fmt.Println(places[r])}//查询单条记录,使用一个结构体接受,并且捕获异常james:=Person{}err = db.Get(&james, "select * from person where first_name=$1", "james")checkErr(err)fmt.Println("%v\n",james)//使用一个结构体进行结果集遍历place:=Place{}rows,err:=db.Queryx("select * from place")for rows.Next(){//拷贝行数据到结构体err:=rows.StructScan(&place)checkErr(err)fmt.Printf("%v\n",place)}//插入一个map结构的数据到数据库中_,err = db.NamedExec(`insert into person (first_name,last_name,email) values (:first,:last,:email)`,map[string]interface{}{"first":"france","last":"Smith","email":"Zonst@zonst.com",})//查询Jonny的两种方法rows,err = db.NamedQuery("select * from person where first_name=:fn",map[string]interface{}{"fn":"Jonny"})rows,err = db.NamedQuery("select * from person where first_name:=first_name",james)
}/**
插入操作*/
func insertTest(db *sqlx.DB){var err error_, err = db.NamedExec(`insert into person (first_name,last_name,email) values (:first,:last,:email)`, map[string]interface{}{"first": "Joy","last": "Smith","email": "Zonst@zonst.com",})checkErr(err)
}/**
更新操作*/
func updateTest(db *sqlx.DB){_,err:=db.Exec("update person set first_name = 'xord' where first_name = $1","jamess")checkErr(err)
}/**
删除操作*/
func deleteTest(db *sqlx.DB){_,err:=db.Exec("delete from person where first_name = $1","xord")checkErr(err)
}/**
关闭连接*/
func close(db *sqlx.DB){db.Close()
}/**
捕获异常*/
func checkErr(err error){if err!=nil {log.Fatalln(err)}
}