一、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 mainimport ( "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_tbltype 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) }}