准备阶段
在这里不多赘述,库表的建立参考菜鸟教程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 main
import (
"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 error
person:=[]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)
}
}