Browse Source

优化

master
lijianbin 2 days ago
parent
commit
55c6c7a6f9
3 changed files with 122 additions and 12 deletions
  1. +18
    -6
      chain.go
  2. +86
    -0
      chain_test.go
  3. +18
    -6
      transaction_chain.go

+ 18
- 6
chain.go View File

@ -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


+ 86
- 0
chain_test.go View File

@ -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) {
//测试数据库连接


+ 18
- 6
transaction_chain.go View File

@ -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


Loading…
Cancel
Save