日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
創(chuàng)新互聯(lián)GoFrame教程:GoFrame鏈?zhǔn)讲僮?寫入保存

Insert/Replace/Save

這幾個鏈?zhǔn)讲僮鞣椒ㄓ糜跀?shù)據(jù)的寫入,并且支持自動的單條或者批量的數(shù)據(jù)寫入,區(qū)別如下:

10年的西藏網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。網(wǎng)絡(luò)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整西藏建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)從事“西藏網(wǎng)站設(shè)計”,“西藏網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。

  • ?Insert?:使用?INSERT INTO?語句進行數(shù)據(jù)庫寫入,如果寫入的數(shù)據(jù)中存在主鍵或者唯一索引時,返回失敗,否則寫入一條新數(shù)據(jù);
  • ?Replace?:使用?REPLACE INTO?語句進行數(shù)據(jù)庫寫入,如果寫入的數(shù)據(jù)中存在主鍵或者唯一索引時,會刪除原有的記錄,必定會寫入一條新記錄;
  • ?Save?:使用?INSERT INTO?語句進行數(shù)據(jù)庫寫入,如果寫入的數(shù)據(jù)中存在主鍵或者唯一索引時,更新原有數(shù)據(jù),否則寫入一條新數(shù)據(jù);

在部分數(shù)據(jù)庫類型中,并不支持?Replace/Save?方法。

這幾個方法往往需要結(jié)合?Data?方法使用,該方法用于傳遞數(shù)據(jù)參數(shù),用于數(shù)據(jù)寫入/更新等寫操作,支持的參數(shù)為?string/map/slice/struct/*struct?。例如,在進行?Insert?操作時,開發(fā)者可以傳遞任意的?map?類型,如: ?map[string]string/map[string]interface{}/map[interface{}]interface{}?等等,也可以傳遞任意的?struct/*struct/[]struct/[]*struct?類型。此外,這幾個方法的參數(shù)列表也支持直接的?data?參數(shù)輸入,該參數(shù)?Data?方法參數(shù)一致。

InsertIgnore

從?GOframe v1.9.0?版本開始,?GoFrame?的?ORM?提供了一個常用寫入方法?InsertIgnore?,用于寫入數(shù)據(jù)時如果寫入的數(shù)據(jù)中存在主鍵或者唯一索引時,忽略錯誤繼續(xù)執(zhí)行寫入。該方法定義如下:

func (m *Model) InsertIgnore(data ...interface{}) (result sql.Result, err error)

InsertAndGetId

從?goframe v1.15.7?版本開始,?goframe?的?ORM?同時也提供了一個常用寫入方法?InsertAndGetId?,用于寫入數(shù)據(jù)時并直接返回自增字段的ID。該方法定義如下:

func (m *Model) InsertAndGetId(data ...interface{}) (lastInsertId int64, err error)

OnDuplicate/OnDuplicateEx

?OnDuplicate/OnDuplicateEx?方法需要結(jié)合?Save?方法一起使用,用于指定?Save?方法的更新/不更新字段,參數(shù)為字符串、字符串?dāng)?shù)組、?Map?。例如:

OnDuplicate("nickname, age")
OnDuplicate("nickname", "age")
OnDuplicate(g.Map{
    "nickname": gdb.Raw("CONCAT('name_', VALUES(`nickname`))"),
})
OnDuplicate(g.Map{
    "nickname": "passport",
})

其中?OnDuplicateEx?用于排除指定忽略更新的字段,排除的字段需要在寫入的數(shù)據(jù)集合中。

使用示例

示例1,基本使用

數(shù)據(jù)寫入/保存方法往往需要結(jié)合?Data?方法使用:

// INSERT INTO `user`(`name`) VALUES('john')
g.Model("user").Data(g.Map{"name": "john"}).Insert()

// INSERT IGNORE INTO `user`(`uid`,`name`) VALUES(10000,'john')
g.Model("user").Data(g.Map{"uid": 10000, "name": "john"}).InsertIgnore()

// REPLACE INTO `user`(`uid`,`name`) VALUES(10000,'john')
g.Model("user").Data(g.Map{"uid": 10000, "name": "john"}).Replace()

// INSERT INTO `user`(`uid`,`name`) VALUES(10001,'john') ON DUPLICATE KEY UPDATE `uid`=VALUES(`uid`),`name`=VALUES(`name`)
g.Model("user").Data(g.Map{"uid": 10001, "name": "john"}).Save()

也可以不使用?Data?方法,而給寫入/保存方法直接傳遞數(shù)據(jù)參數(shù):

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"})

數(shù)據(jù)參數(shù)也常用struct類型,例如當(dāng)表字段為 ?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()

示例2,數(shù)據(jù)批量寫入

// INSERT INTO `user`(`name`) VALUES('john_1'),('john_2'),('john_3')
g.Model("user").Data(g.List{
    {"name": "john_1"},
    {"name": "john_2"},
    {"name": "john_3"},
}).Insert()

可以通過?Batch?方法指定批量操作中分批寫入條數(shù)數(shù)量(默認是10),以下示例將會被拆分為兩條寫入請求:

// INSERT INTO `user`(`name`) VALUES('john_1'),('john_2')
// INSERT INTO `user`(`name`) VALUES('john_3')
g.Model("user").Data(g.List{
    {"name": "john_1"},
    {"name": "john_2"},
    {"name": "john_3"},
}).Batch(2).Insert()

示例3,數(shù)據(jù)批量保存

批量保存操作與單條保存操作原理是一樣的,當(dāng)寫入的數(shù)據(jù)中存在主鍵或者唯一索引時將會更新原有記錄值,否則新寫入一條記錄。

// 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?是字符串類型,該類型的參數(shù)將會直接作為?SQL?片段嵌入到提交到底層的?SQL?語句中,不會被自動轉(zhuǎn)換為字符串參數(shù)類型、也不會被當(dāng)做預(yù)處理參數(shù)。例如:

// INSERT INTO `user`(`id`,`passport`,`password`,`nickname`,`create_time`) VALUES('id+2','john','123456','now()')
g.Model("user").Data(g.Map{
	"id":          "id+2",
	"passport":    "john",
	"password":    "123456",
	"nickname":    "JohnGuo",
	"create_time": "now()",
}).Insert()
// 執(zhí)行報錯: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())
g.Model("user").Data(g.Map{
	"id":          gdb.Raw("id+2"),
	"passport":    "john",
	"password":    "123456",
	"nickname":    "JohnGuo",
	"create_time": gdb.Raw("now()"),
}).Insert()

新聞名稱:創(chuàng)新互聯(lián)GoFrame教程:GoFrame鏈?zhǔn)讲僮?寫入保存
地址分享:http://www.dlmjj.cn/article/dpgciji.html