• go 递归 数据多层级横向展开 插入数据库


    需求,在两张表(一张主表,一张明细表,一对多的关系)中有层级关系,比如A(主表数据),A1,A2,A3,A4(明细表数据),而A1这些数据下面还有别的数据那它们也会出现在主表中,需要将多层级的数据横向展示,A-A1-A11-A111-A111这样,查最后一个没有明细表数据位置,数据有多少层是不确定的

    代码实现:

    package main
    
    import (
    	"bufio"
    	"fmt"
    	"os"
    	"strconv"
    	"strings"
    	"time"
    
    	_ "github.com/alexbrainman/odbc"
    )
    
    func main() {
    	for {
    		chuliYuanExecl()
    	}
    }
    func chuliYuanExecl() {
    	for {
    		fmt.Println("开始")
    		start := time.Now()
    		// 这里原本是从数据库查出来的编号,先用数组代替
    		var xspjs = []int{1, 2, 3, 4, 5, 6, 7}
    		for _, value := range xspjs {
    			// 层级
    			var num = 0
    			// 数据库插入值,用于拼接sql
    			vaulestrlist := []string{}
    			// 数据库字段名,用于拼接sql
    			keystrlist := []string{}
    			bomfenjie(value, num, vaulestrlist, keystrlist)
    		}
    		fmt.Println()
    		fmt.Println()
    		elapsed := time.Since(start)
    		fmt.Println("执行完成耗时:", elapsed)
    		fmt.Print("按回车键结束")
    		input := bufio.NewScanner(os.Stdin)
    		input.Scan()
    		if strings.Compare(strings.TrimSpace(input.Text()), "") == 0 {
    			os.Exit(0)
    		}
    		return
    	}
    }
    func bomfenjie(item int, num int, vaulestrlist []string, keystrlist []string) {
    	itemcode := item
    	// 字段名不一样所以单独处理
    	if num == 0 {
    		vaulestrlist = append(vaulestrlist, "'"+strconv.Itoa(itemcode)+"'")
    		keystrlist = append(keystrlist, "zjcode")
    	} else {
    		// 这里的字段设置根据数据库的,当时为了这样处理方便设计的数据库
    		vaulestrlist = append(vaulestrlist, "'"+strconv.Itoa(itemcode)+"'")
    		keystrlist = append(keystrlist, "code"+strconv.Itoa(num))
    	}
    
    	// 这里其实应该用上面的itemcode进行连表查询看看明细表有没有数据
    	// 这里的判断其实应该是判断明细表数据是否是0条
    	// 因为层级多少是不确定的,这里用减在结果上体现一下
    	if item > (80 - num) {
    		// 如果是0条了说明是最后一条数据,进行拼接sql语句
    		fmt.Println(`INSERT INTO BOM_ALLVALUES_X_QHG (` + strings.Join(keystrlist, ",") + `) VALUES (` + strings.Join(vaulestrlist, ",") + `)`)
    		// 这里要重置,不然的话同级的数据会被拼接在一起
    		vaulestrlist = vaulestrlist[0:0]
    		vaulestrlist = append(vaulestrlist, "'"+strconv.Itoa(item)+"'")
    		keystrlist = append(keystrlist, "zjcode")
    	} else {
    		// 有明细的数据,层级加1
    		num = num + 1
    		// 原本这里是for循环,将明细表里查出来的编号数据再进行递归,这里用加数字加代替了
    		item = item + 10
    		// 递归
    		go bomfenjie(item, num, vaulestrlist, keystrlist)
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78

    结果:
    在这里插入图片描述

  • 相关阅读:
    无法打开文件“opengl32.lib”
    搭建花店小程序商城的详细步骤
    idea远程debug
    产品软文怎么写?掌握这几个技巧你也能写
    Linux + mysql面试题
    多模态大模型时代下的文档图像智能分析与处理
    docker-compose部署mysql
    PAT 1025 反转链表
    [计算机网络] 虚拟局域网
    《动手学深度学习 Pytorch版》 8.2 文本预处理
  • 原文地址:https://blog.csdn.net/u013055678/article/details/133793365