什么是xorm

xorm是一个简单而强大的Go语言ORM库. 通过它可以使数据库操作非常简便。 xorm的目标并不是让你完全不去学习SQL,我们认为SQL并不会为ORM所替代,但是ORM将可以解决绝大部分的简单SQL需求。 xorm支持两种风格的混用。


使用原因

简化sql的请求,不用写那么多的sql。


文档

http://xorm.io/docs/


安装

go get github.com/go-xorm/xorm

测试链接

package main

import (
	_ "github.com/go-sql-driver/mysql"
	"github.com/go-xorm/xorm"
	"log"
)

var engine *xorm.Engine

func main() {
	var err error
	engine, err = xorm.NewEngine("mysql", "root:@/xorm_test?charset=utf8")

	if err != nil {
		log.Println("got err when new engine: ", err)
	}

	err = engine.Ping()
	if err != nil {
		log.Println("got err when ping db: ", err)
	}

	log.Println("connection is success!")
}

一般情况下如果只操作一个数据库,只需要创建一个engine即可。engine是GoRoutine安全的。


日志

日志是一个接口,通过设置日志,可以显示SQL,警告以及错误等,默认的显示级别为INFO。

engine.ShowSQL(true),则会在控制台打印出生成的SQL语句; engine.Logger().SetLevel(core.LOG_DEBUG),则会在控制台打印调试及以上的信息;


获取数据库信息

DBMetas()

xorm支持获取表结构信息,通过调用engine.DBMetas()可以获取到数据库中所有的表,字段,索引的信息。

TableInfo()

根据传入的结构体指针及其对应的Tag,提取出模型对应的表结构信息。这里不是数据库当前的表结构信息,而是我们通过struct建模时希望数据库的表的结构信息

tables, err := engine.DBMetas()
if err != nil {
    log.Println("got err when get db metas: ", err)
}
for _, v := range tables {
    log.Println("table name: ", v.Name)
    log.Println("columns: ")
    for _, c := range v.Columns(){
        log.Println("--- column name: ", c.Name)
    }
    log.Println("cahrset: ", v.Charset)
    log.Println("primary key: ", v.PrimaryKeys)
}

定义map

type User struct {
    Id   int64
    Name string  `xorm:"varchar(25) notnull unique 'usr_name'"`
}

同步struct到数据库

创建和更新表结构

// sync
err = engine.Sync2(new(model.User))
if err != nil {
    log.Fatal("got err when sync user: ", err)
}

CRUD

CRUD是指在做计算处理时的增加(Create)、读取(Retrieve)(重新得到数据)、更新(Update)和删除(Delete)几个单词的首字母简写。

insert

//insert
user := new(model.User)
user.Name = "myname"
affected, err := engine.Insert(user)
// INSERT INTO user (name) values (?)
if err != nil {
    log.Fatal("got err when insert into user: ", err)
}
log.Println("insertation success: ", affected)



update

//update
user2 := new(model.User)
user2.Name = "huayun"
affected, err := engine.Id(1).Update(user2)
if err != nil {
    log.Fatal("got err when insert into user: ", err)
}
log.Println("update success: ", affected)

delete

// delete
user := new(model.User)
affected, err := engine.Id(1).Delete(user)
if err != nil {
    log.Fatal("got err when delete user: ", err)
}
log.Println("delete success: ", affected)

get one

user := &User{Id:1}
has, err := engine.Get(user)
// get
user3 := &model.User{Id:5}
has, err := engine.Get(user3)
if err != nil {
    log.Fatal("got err when get user: ", err)
}

if has {
    log.Println("get user by id, result: ", user3)
} else {
    log.Println("get user by id, result  ", user3)
}

find

// find
users := make([]model.User, 0)
err = engine.Where("name != ?", "xlw").Limit(20, 0).Find(&users)
if err != nil {
    log.Fatal("got err when find users: ", err)
}
log.Println("find users, result: ", users)

query

// query
sql := "select * from user"
results, err := engine.Query(sql)
if err != nil {
    log.Fatal("got err when exec query: ", err)
}
log.Println("query result: ", results)

github repository url