From 55c6c7a6f9aa449e727b54489c320108add0e263 Mon Sep 17 00:00:00 2001 From: lijianbin <513837235@.qq.com> Date: Sat, 11 Oct 2025 16:28:35 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- chain.go | 24 +++++++++---- chain_test.go | 86 ++++++++++++++++++++++++++++++++++++++++++++ transaction_chain.go | 24 +++++++++---- 3 files changed, 122 insertions(+), 12 deletions(-) diff --git a/chain.go b/chain.go index 5e95f52..4ede69b 100644 --- a/chain.go +++ b/chain.go @@ -24,7 +24,7 @@ type Query struct { join [][]string //[["tablea as a","a.id=b.id","left"]] save_data []map[string]interface{} //批量操作的数据[["title":"a","num":1,],["title":"a","num":1,]] upd_field []string // 批量更新时需要更新的字段,为空时按除id外的字段进行更新 - merge_into_where_field string //达梦8和pgsql中,替换ON DUPLICATE KEY UPDATE时的唯一键名/主键名 + merge_into_where_field []string //达梦8和pgsql中,替换ON DUPLICATE KEY UPDATE时的唯一键名/主键名 data []string value []interface{} orderby string @@ -163,7 +163,7 @@ func (this *Query) Join(join []string) *Query { } // 在达梦和pgsql中,使用merge into去替换mysql--insert into...ON DUPLICATE KEY UPDATE时,需指定唯一键,字段存在id时无需设置 -func (this *Query) MergeIntoWhereField(value string) *Query { +func (this *Query) MergeIntoWhereField(value []string) *Query { this.merge_into_where_field = value return this } @@ -699,8 +699,14 @@ func (this *Query) UpdateAllStmt() error { val_field := addPrefixInField(this.data, "s.") //和mysql更新或添加机制不一样,需指定on条件 on_field := `t.id = s.id` - if this.merge_into_where_field != "" { - on_field = `t.` + this.merge_into_where_field + ` = s.` + this.merge_into_where_field + if len(this.merge_into_where_field) > 0 { + for ind, mf := range this.merge_into_where_field { + if ind > 0 { + on_field += " and " + `t.` + mf + ` = s.` + mf + } else { + on_field = `t.` + mf + ` = s.` + mf + } + } } sql = `merge into ` + dbName + ` as t @@ -730,8 +736,14 @@ func (this *Query) UpdateAllStmt() error { } //和mysql更新或添加机制不一样,需指定on条件 on_field := `t.id = s.id` - if this.merge_into_where_field != "" { - on_field = `t.` + this.merge_into_where_field + ` = s.` + this.merge_into_where_field + if len(this.merge_into_where_field) > 0 { + for ind, mf := range this.merge_into_where_field { + if ind > 0 { + on_field += " and " + `t.` + mf + ` = s.` + mf + } else { + on_field = `t.` + mf + ` = s.` + mf + } + } } sql = `MERGE INTO ` + dbName + ` AS t diff --git a/chain_test.go b/chain_test.go index 4957383..ff6a605 100644 --- a/chain_test.go +++ b/chain_test.go @@ -1,10 +1,96 @@ package dbquery import ( + "encoding/json" "fmt" + "git.tetele.net/tgo/helper" + "log" + "strings" "testing" + "time" ) +func CreateData(dbname string, data []map[string]interface{}) (int64, error) { + timestamp := time.Now().Unix() + rows := make([]map[string]interface{}, 0) + region_id_arr := []string{} + for _, v := range data { + region_id_arr = append(region_id_arr, helper.ToStr(v["regionId"])) + rows = append(rows, map[string]interface{}{ + "region_id": v["regionId"], + "name": v["regionName"], + "createtime": timestamp, + "updatetime": timestamp, + "is_delete": 0, + "deletetime": 0, + }) + } + where := "1=1" + if len(region_id_arr) > 0 { + where = "region_id not in('" + strings.Join(region_id_arr, "','") + "')" + } + _, err := new(Query).Db(dbname).Clean().Table("ttl_project"). + Data("is_delete=?").Value(1). + Data("deletetime=?").Value(timestamp). + Where(where). + Update() + if err != nil { + log.Println("update project err", err) + } + if len(rows) > 0 { + _, err := new(Query).Db(dbname).Clean().Table("ttl_project"). + SaveDatas(rows). + UpdFields([]string{"updatetime", "is_delete", "deletetime", "name"}). + MergeIntoWhereField([]string{"region_id"}). + UpdateAll() + if err != nil { + log.Println("insert to project err", err) + } + } else { + log.Println("rows is null", rows) + } + return 0, nil +} + +func Test_ChainM(t *testing.T) { + err := DmConnect("192.168.233.155", "WUYE", "Bin123456", "", "5236") + if err != nil { + t.Log(err) + } + db_name := "" + var apiResp map[string]interface{} + + test_json := `{"code":0,"message":"success","data":[{"regionId":"1","regionName":"项目 1"},{"regionId":"2","regionName":"项目 2"}]}` + err = json.Unmarshal([]byte(test_json), &apiResp) + if err != nil { + log.Println("------Get region queryType json Unmarshal err", err.Error()) + return + } + + if _, exist := apiResp["code"]; exist { + if helper.ToInt(apiResp["code"]) == 0 { + if _, exist = apiResp["data"]; exist { + data, err := helper.InterfaceToMapInterfaceArr(apiResp["data"]) + if err != nil { + log.Println("数据转换失败,", err.Error()) + } else { + if len(data) > 0 { + log.Println("data", data) + CreateData(db_name, data) + } + } + } else { + log.Println("请求无数据返回") + } + } else { + log.Println("请求异常message:", apiResp["message"]) + } + } else { + log.Println("code is not exist", apiResp) + } + +} + // 测试各数据库下各种情况 func Test_Chain(t *testing.T) { //测试数据库连接 diff --git a/transaction_chain.go b/transaction_chain.go index 169f6ce..26f995d 100644 --- a/transaction_chain.go +++ b/transaction_chain.go @@ -26,7 +26,7 @@ type TxQuery struct { value []interface{} save_data []map[string]interface{} //批量操作的数据[["title":"a","num":1,],["title":"a","num":1,]] upd_field []string // 批量更新时需要更新的字段,为空时按除id外的字段进行更新 - merge_into_where_field string //达梦8和pgsql中,替换ON DUPLICATE KEY UPDATE时的唯一键名/主键名 + merge_into_where_field []string //达梦8和pgsql中,替换ON DUPLICATE KEY UPDATE时的唯一键名/主键名 orderby string groupby string having string @@ -160,7 +160,7 @@ func (this *TxQuery) Join(join []string) *TxQuery { } // 在达梦和pgsql中,使用merge into去替换mysql--insert into...ON DUPLICATE KEY UPDATE时,需指定唯一键,字段存在id时无需设置 -func (this *TxQuery) MergeIntoWhereField(value string) *TxQuery { +func (this *TxQuery) MergeIntoWhereField(value []string) *TxQuery { this.merge_into_where_field = value return this } @@ -655,8 +655,14 @@ func (this *TxQuery) UpdateAllStmt() error { val_field := addPrefixInField(this.data, "s.") //和mysql更新或添加机制不一样,需指定on条件 on_field := `t.id = s.id` - if this.merge_into_where_field != "" { - on_field = `t.` + this.merge_into_where_field + ` = s.` + this.merge_into_where_field + if len(this.merge_into_where_field) > 0 { + for ind, mf := range this.merge_into_where_field { + if ind > 0 { + on_field += " and " + `t.` + mf + ` = s.` + mf + } else { + on_field = `t.` + mf + ` = s.` + mf + } + } } sql = `merge into ` + dbName + ` as t @@ -686,8 +692,14 @@ func (this *TxQuery) UpdateAllStmt() error { } //和mysql更新或添加机制不一样,需指定on条件 on_field := `t.id = s.id` - if this.merge_into_where_field != "" { - on_field = `t.` + this.merge_into_where_field + ` = s.` + this.merge_into_where_field + if len(this.merge_into_where_field) > 0 { + for ind, mf := range this.merge_into_where_field { + if ind > 0 { + on_field += " and " + `t.` + mf + ` = s.` + mf + } else { + on_field = `t.` + mf + ` = s.` + mf + } + } } sql = `MERGE INTO ` + dbName + ` AS t