Golang操作PostgreSQL
注意!!我用的是xorm框架
本文是通过github.com/bmizerany/pq驱动和github.com/go-xorm/xorm框架去操作Pg的,使用前者是因为这个驱动使用的人数比较多,论坛活跃。使用xorm框架去实现操作是因为这样可以少些很多原生的SQL代码,减少出错。
首先我们得有个Pg数据库,这里就不介绍如何去部署了。在数据库中我们创建一个数据库和表,SQL语句如下:
create database test_database;
create table users
(
id int,
sex int,
username varchar,
info varchar,
primary key (id)
)
然后我们就可以使用程序去操作Pg数据库啦,下面是代码,记得先get这两个包
"github.com/go-xorm/xorm"
"github.com/lib/pq"
package main
import (
"fmt"
"github.com/go-xorm/xorm"
_ "github.com/lib/pq"
"log"
)
//写上自己的数据库的配置
const (
host = ""
port = 5432
user = ""
password = ""
dbName = ""
)
type Users struct {
Id int
Username string
Sex int
Info string
}
func main() {
userModel := &Users{
Id: 1,
Username: "windows",
Sex: 1,
Info: "操作系统",
}
fmt.Println(userModel)
engine := getDBEngine()
//insertUser(engine, userModel)
//deleteUserBySQL(engine, "windows")
//updateUser(engine, userModel)
selectAll(engine, "windows")
}
//连接
func getDBEngine() *xorm.Engine {
psqlInfo := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable", host, port, user, password, dbName)
engine, err := xorm.NewEngine("postgres", psqlInfo)
if err != nil {
log.Fatal(err)
return nil
}
engine.ShowSQL()
err = engine.Ping()
if err != nil {
log.Fatal(err)
return nil
}
fmt.Println("connect postgresql success")
return engine
}
//查询
func selectAll(engine *xorm.Engine, name string) {
var user []Users
err := engine.Where("users.username=?", name).Find(&user)
if err != nil {
log.Println(err)
return
}
fmt.Println(user)
}
//插入
func insertUser(engine *xorm.Engine, user *Users) {
rows, err := engine.Table("users").Insert(user)
if err != nil {
log.Println(err)
return
}
if rows == 0 {
fmt.Println("插入失败")
return
}
fmt.Println("插入成功")
}
//删除
func deleteUser(engine *xorm.Engine, name string) {
user := Users{Username: name}
rows, err := engine.Delete(&user)
if err != nil {
log.Println(err)
return
}
if rows == 0 {
fmt.Println("删除失败")
return
}
fmt.Println("删除成功")
}
//修改
func updateUser(engine *xorm.Engine, user *Users) {
//Update(bean interface{}, condiBeans ...interface{}) bean是需要更新的bean,condiBeans是条件
update, err := engine.Update(user, Users{Id: user.Id})
if err != nil {
log.Println(err)
return
}
if update > 0 {
fmt.Println("更新成功")
return
}
log.Println("更新失败")
}
//事务
func sessionUserTest(engine *xorm.Engine, user *Users) {
session := engine.NewSession()
session.Begin()
_, err := session.Insert(user)
if err != nil {
session.Rollback()
log.Fatal(err)
}
user.Username = "mac"
_, err = session.Update(user, Users{Id: user.Id})
if err != nil {
session.Rollback()
log.Fatal(err)
}
err = session.Commit()
if err != nil {
log.Fatal(err)
}
}
注意一下我的命名规范,我的数据库表名是users,程序的结构体名字是Users,操作数据库的时候我没有指定表名,xorm框架会自动把我的结构体的名字解析作为表名,
解析的规则是大写变小写加下划线
我们也可以指定表名,使用engine.table("users")就可以指定表名