- Created by 郭强, last modified on Dec 30, 2020
You are viewing an old version of this page. View the current version.
Compare with Current View Page History
« Previous Version 7 Next »
Update
更新方法
Update
用于数据的更新,往往需要结合Data
及Where
方法共同使用。Data
方法用于指定需要更新的数据,Where
方法用于指定更新的条件范围。同时,Update
方法也支持直接给定数据和条件参数。
需要注意部分数据库类型支持更新条件结合查询、排序、分组、条数等共同使用。
使用示例:
// UPDATE `user` SET `name`='john guo' WHERE name='john'
r, err := db.Table("user").Data(g.Map{"name" : "john guo"}).Where("name", "john").Update()
r, err := db.Table("user").Data("name='john guo'").Where("name", "john").Update()
// UPDATE `user` SET `status`=1 ORDER BY `login_time` asc LIMIT 10
r, err := db.Table("user").Data("status", 1).Order("login_time asc").Limit(10).Update()
// UPDATE `user` SET `status`=1
r, err := db.Table("user").Data("status=1").Update()
r, err := db.Table("user").Data("status", 1).Update()
r, err := db.Table("user").Data(g.Map{"status" : 1}).Update()
也可以直接给Update
方法传递data
及where
参数:
// UPDATE `user` SET `name`='john guo' WHERE name='john'
r, err := db.Table("user").Update(g.Map{"name" : "john guo"}, "name", "john")
r, err := db.Table("user").Update("name='john guo'", "name", "john")
// UPDATE `user` SET `status`=1
r, err := db.Table("user").Update("status=1")
r, err := db.Table("user").Update(g.Map{"status" : 1})
Counter
更新特性
可以使用Counter
类型参数对特定的字段进行数值操作,例如:增加、减少操作。
Counter
数据结构定义:
// Counter is the type for update count. type Counter struct { Field string Value float64 }
Counter
使用示例
gdbCounter := &gdb.Counter{ Field: "views", Value: 1, } updateData := g.Map{ "views": gdbCounter, } result, err := db.Update(tableName, updateData, "id", 1)
RawSQL
条件语句嵌入
gdb.Raw
是字符串类型,该类型的参数将会直接作为SQL
片段嵌入到提交到底层的SQL
语句中,不会被自动转换为字符串参数类型、也不会被当做预处理参数。例如:
// INSERT INTO `user`(`id`,`passport`,`password`,`nickname`,`create_time`) VALUES('id+2','john','123456','now()') db.Model("user").Data(g.Map{ "id": "id+2", "passport": "john", "password": "123456", "nickname": "JohnGuo", "create_time": "now()", }).Insert() // 执行报错:Error Code: 1136. Column count doesn't match value count at row 1 // UPDATE `user` SET login_count='login_count+1',update_time='now()' WHERE id=1 db.Model("user").Data(g.Map{ "login_count": "login_count+1", "update_time": "now()", }).Where("id", 1).Update() // 执行报错:Error Code: 1136. Column count doesn't match value count at row 1
使用gdb.Raw
改造后:
// INSERT INTO `user`(`id`,`passport`,`password`,`nickname`,`create_time`) VALUES(id+2,'john','123456',now()) db.Model("user").Data(g.Map{ "id": gdb.Raw("id+2"), "passport": "john", "password": "123456", "nickname": "JohnGuo", "create_time": gdb.Raw("now()"), }).Insert() // UPDATE `user` SET login_count=login_count+1,update_time=now() WHERE id=1 db.Model("user").Data(g.Map{ "login_count": gdb.Raw("login_count+1"), "update_time": gdb.Raw("now()"), }).Where("id", 1).Update()
Delete
删除方法
Delete
方法用于数据的删除。
使用示例
// DELETE FROM `user` WHERE uid=10
r, err := db.Table("user").Where("uid", 10).Delete()
// DELETE FROM `user` ORDER BY `login_time` asc LIMIT 10
r, err := db.Table("user").Order("login_time asc").Limit(10).Delete()
也可以直接给Delete
方法传递where
参数:
// DELETE FROM `user` WHERE `uid`=10
r, err := db.Table("user").Delete("uid", 10)
// DELETE FROM `user` WHERE `score`<60
r, err := db.Table("user").Delete("score < ", 60)
Content Menu
- No labels