xorm操作PostgreSQL数据库(增删改查实例)
一、xorm介绍
xorm是一个简单而强大的Go语言ORM库.通过它可以使数据库操作非常简便。xorm的目标并不是让你完全不去学习SQL,我们认为SQL并不会为ORM所替代,但是ORM将可以解决绝大部分的简单SQL需求。xorm支持两种风格的混用。
特性
- 支持Struct和数据库表之间的灵活映射,并支持自动同步表结构
- 事务支持
- 支持原始SQL语句和ORM操作的混合执行
- 使用连写来简化调用
- 支持使用Id, In, Where, Limit, Join, Having, Table, Sql, Cols等函数和结构体等方式作为条件
- 支持级联加载Struct
- 支持LRU缓存(支持memory, memcache, leveldb, redis缓存Store)和 Redis缓存
- 支持反转,即根据数据库自动生成xorm的结构体
- 支持事件
- 支持created, updated, deleted和version记录版本(即乐观锁)
驱动支持
xorm当前支持的驱动和数据库如下:
- Mysql: github.com/go-sql-driver/mysql
- MyMysql: github.com/ziutek/mymysql/godrv
- Postgres: github.com/lib/pq
- Tidb: github.com/pingcap/tidb
- SQLite: github.com/mattn/go-sqlite3
- MsSql: github.com/denisenkom/go-mssqldb
- MsSql: github.com/lunny/godbc
- Oracle: github.com/mattn/go-oci8 (试验性支持)
- ql: github.com/cznic/ql (试验性支持)
二、下载
安装xorm
go get github.com/go-xorm/xorm
安装Postgres驱动
go get github.com/lib/pq
三、实例
注意:要先导入postgreSQL驱动 _“github.com/lib/pq”
package main
import (
"github.com/go-xorm/xorm"
_ "github.com/lib/pq"
"log"
"fmt"
)
const (
host = "localhost"
port = 5432
user = "postgres"
password = "your_password"
dbName="your_db_name"
)
func main() {
user := &UserTbl{
Id:1,
Username :"Windows",
Sex :1,
Info : "操作系统",
}
SessionUserTest(user)
}
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
}
//table name 为user_tbl
type UserTbl struct {
Id int
Username string
Sex int
Info string
}
//查询所有
func selectAll() {
var user []UserTbl
engine := getDBEngine()
engine.SQL("select * from user_tbl").Find(&user)
fmt.Println(user)
}
//条件查询
func selectUser(name string) {
var user []UserTbl
engine := getDBEngine()
engine.Where("user_tbl.username=?",name).Find(&user)
fmt.Println(user)
}
//可以用Get查询单个元素
func selectOne(id int) {
var user UserTbl
engine := getDBEngine()
engine.Id(id).Get(&user)
//engine.Alias("u").Where("u.id=?",id).Get(&user)
fmt.Println(user)
}
//添加
func InsertUser(user *UserTbl) bool {
engine := getDBEngine()
rows,err := engine.Insert(user)
if err != nil {
log.Println(err)
return false
}
if rows == 0 {
return false
}
return true
}
//删除(根据名称删除)
func DeleteUser(name string) bool {
user := UserTbl{
Username:name,
}
engine := getDBEngine()
rows,err := engine.Delete(&user)
if err != nil {
log.Println(err)
return false
}
if rows == 0 {
return false
}
return true
}
//利用sql删除
func DeleteUserBySQL(name string) bool {
engine := getDBEngine()
result,err := engine.Exec("delete from user_tbl where username=?",name)
if err != nil {
log.Println(err)
return false
}
rows,err :=result.RowsAffected()
if err == nil && rows >0 {
return true
}
return false
}
//更新
func UpdateUser(user *UserTbl) bool {
engine := getDBEngine()
//Update(bean interface{}, condiBeans ...interface{}) bean是需要更新的bean,condiBeans是条件
rows,err := engine.Update(user,UserTbl{Id:user.Id})
if err != nil {
log.Println(err)
return false
}
if rows > 0 {
return true
}
return false
}
//利用session进行增删改
//用session的好处就是可以事务处理
func SessionUserTest(user *UserTbl) {
engine := getDBEngine()
session := engine.NewSession()
session.Begin()
_,err := session.Insert(user)
if err != nil {
session.Rollback()
log.Fatal(err)
}
user.Username="windows"
_,err = session.Update(user,UserTbl{Id:user.Id})
if err != nil {
session.Rollback()
log.Fatal(err)
}
_,err = session.Delete(user)
if err != nil {
session.Rollback()
log.Fatal(err)
}
err = session.Commit()
if err != nil {
log.Fatal(err)
}
}
还没有评论,来说两句吧...