2

Xorm常用操作,持续更新中...

ORMadmin11643 次浏览

以下示例均来自本站源码  https://github.com/goofcc/gorevel

如果你有好用的语句,请贴到回复中分享,众人拾柴火焰高。

1、连接数据库mysql

params := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8&parseTime=true", user, password, host, dbname)
Engine, err = xorm.NewEngine("mysql", params)
// defer Engine.Close()

if err != nil {
	panic(err)
}

2、定义表结构

type Category struct {
	Id      int64
	Name    string
	Intro   string
	Created time.Time `xorm:"created"`
}
 //created表示插入记录时自动写入时间

type Topic struct {
	Id       int64
	Title    string
	Content  string   `xorm:"text"`
	Category Category `xorm:"category_id bigint"`
	User     User     `xorm:"user_id bigint"`
	Hits     int
	Replies  int
	Good     bool
	Created  time.Time `xorm:"created"`
	Updated  time.Time `xorm:"updated"`
}
//updated表示更新记录时自动写入时间
Topic中的Category关联到Category结构,category_id为映射到数据库中的字段。
查询Topic时自动关联查询Category。

3、同步表结构到数据库中

err = Engine.Sync(
	new(User),
	new(Category),
	new(Topic),
	new(Reply),
	new(Permissions),
	)

if err != nil {
	panic(err)
}

4、插入一条记录

aff, _ := engine.Insert(&models.Reply{
	Content: content,
	})
if aff > 0 {
	c.Flash.Success(“成功”)
} else {
	c.Flash.Error("失败")
}

5、查询一条记录Get

var topic models.Topic
has, _ := engine.Id(id).Get(&topic)
if !has {
	return c.NotFound("帖子不存在")
}

或

var topic models.Topic
has, _ := engine.Where("id = ?", id).Get(&topic)
if !has {
	return c.NotFound("帖子不存在")
}

6、更新一条记录

1、
var category models.Category
category.Name = "ORM"

aff, _ := engine.Id(id).Update(&category)
if aff > 0 {
	c.Flash.Success("成功")
}

2、
aff, _ := engine.Id(id).Cols("name").Update(&category{Name: "ORM"})
if aff > 0 {
	c.Flash.Success("成功")
}

3、
engine.Exec("UPDATE category SET name = ? WHERE id = ?", id, "ORM")

对于字段值为false或0或空值的更新,xorm默认不会更新,需要使用后面两种方法更新,
或者使用特定函数UseBool()更新bool型字段,AllCols()更新所有字段,MustCols("intField")更新int型字段

4、
aff, err := engine.Table(new(User)).Id(id).Update(map[string]interface{}{"age":0})

7、删除记录

aff, _ := engine.Id(id).Delete(&models.Category{})
if aff > 0 {
	return c.RenderJson(map[string]bool{"status": true})
}

8、查询多条记录Find

var users []models.User
engine.Find(&users)

或带查询条件

var replies []models.Reply
engine.Where("topic_id = ?", id).Find(&replies)

可以带多个条件

engine.Where("a = ? AND b = ? OR c = ?", a, b, c).Find(&replies)

 

    共2个回复
    lunny 回复

    总结得非常好啊!

    admin 回复

    感谢lunny到来,你的xorm好用啊,顺手,哈哈