golang操作postgresql数据库

准备阶段

在这里不多赘述,库表的建立参考菜鸟教程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)
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值