Insert/Replace/Save
Insert
使用
INSERT INTO
语句进行数据库写入,如果写入的数据中存在主键或者唯一索引时,返回失败,否则写入一条新数据。Replace
使用
REPLACE INTO
语句进行数据库写入,如果写入的数据中存在主键或者唯一索引时,会删除原有的记录,必定会写入一条新记录。Save
这几个方法需要结合Data
方法使用,该方法用于传递数据参数,用于数据写入/更新等写操作。
InsertIgnore
用于写入数据时如果写入的数据中存在主键或者唯一索引时,忽略错误继续执行写入。该方法定义如下:
InsertAndGetId
用于写入数据时并直接返回自增字段的ID
。该方法定义如下:
func (m *Model) InsertAndGetId(data ...interface{}) (lastInsertId int64, err error)
OnDuplicate/OnDuplicateEx
OnDuplicate/OnDuplicateEx
方法需要结合Save
方法一起使用,用于指定Save
方法的更新/不更新字段,参数为字符串、字符串数组、Map
。例如:
OnDuplicate("nickname, age")
OnDuplicate("nickname", "age")
OnDuplicate(g.Map{
})
OnDuplicate(g.Map{
})
使用示例
数据写入/保存方法需要结合Data
方法使用:
也可以不使用Data
方法,而给写入/保存方法直接传递数据参数:
g.Model("user").Insert(g.Map{"name": "john"})
g.Model("user").Replace(g.Map{"uid": 10000, "name": "john"})
g.Model("user").Save(g.Map{"uid": 10001, "name": "john"})
数据参数也常用 struct
类型,例如当表字段为 uid/name/site
时:
type User struct {
Uid int `orm:"uid"`
Name string `orm:"name"`
Site string `orm:"site"`
}
user := &User{
Uid: 1,
Name: "john",
Site: "https://goframe.org",
}
// INSERT INTO `user`(`uid`,`name`,`site`) VALUES(1,'john','https://goframe.org')
g.Model("user").Data(user).Insert()
可以通过Batch
方法指定批量操作中分批写入条数数量(默认是),以下示例将会被拆分为两条写入请求:
// INSERT INTO `user`(`name`) VALUES('john_1'),('john_2')
// INSERT INTO `user`(`name`) VALUES('john_3')
{"name": "john_1"},
{"name": "john_2"},
{"name": "john_3"},
}).Batch(2).Insert()
批量保存操作与单条保存操作原理是一样的,当写入的数据中存在主键或者唯一索引时将会更新原有记录值,否则新写入一条记录。
// INSERT INTO `user`(`uid`,`name`) VALUES(10000,'john_1'),(10001,'john_2'),(10002,'john_3')
// ON DUPLICATE KEY UPDATE `uid`=VALUES(`uid`),`name`=VALUES(`name`)
g.Model("user").Data(g.List{
{"uid":10000, "name": "john_1"},
{"uid":10001, "name": "john_2"},
{"uid":10002, "name": "john_3"},
}).Save()
RawSQL
语句嵌入
使用gdb.Raw
改造后:
// INSERT INTO `user`(`id`,`passport`,`password`,`nickname`,`create_time`) VALUES(id+2,'john','123456',now())
g.Model("user").Data(g.Map{
"id": gdb.Raw("id+2"),
"passport": "john",
"password": "123456",
"nickname": "JohnGuo",