zoukankan      html  css  js  c++  java
  • go postgresql array enum 的null处理

    将postgresql数组字段的初始值定为空串时报错,应设置为'{}'

     pq: 有缺陷的数组常量:""

    若数组字段rows.Scan用interface{}输入,会是base64编码,但如果字段可为null,scan到string又会报错

    最后将表里面的字段设为not null,然后go读出的string为image=="{... , ... , ...}"

    strings.Split(image[1:len(image)-1],",")

    postgresql的enum类型读出到go的interface{}时也是base64编码,所以尽量将非字符串类型设为not null,可以直接scan到string

    最后用[]byte处理

    //这个函数会close rows	rows中的字段全部用字符串处理,如果rows中有null会报错,keys指要将string转为string array的key
    func rowsToMapArray(rows *sql.Rows, keys ...string) (code int, msg, debugMsg string, res []map[string]interface{}) {
    	defer rows.Close()
    	cols, err := rows.Columns()
    	if err != nil {
    		return j.CodeRowsScanError, j.MsgRowsScanError, err.Error(), nil
    	}
    	num := len(cols)
    	for rows.Next() {
    		str := make([][]byte, num)
    		row := map[string]interface{}{}
    		var args []interface{}
    		for i := 0; i < num; i++ {
    			//interface{}时数据库的enum 和 array类型 Scan会乱码,但能自动识别int/string类型,
    			args = append(args, &str[i])
    		}
    		err = rows.Scan(args...)
    		if err != nil {
    			return j.CodeRowsScanError, j.MsgRowsScanError, err.Error(), nil
    		}
    		for i := 0; i < num; i++ {
    			row[cols[i]] = string(str[i]) //row[cols[i]]=args[i]得到的会是base64
    		}
    		for _, val := range keys {
    			err = stringToStringArray(row, val)
    			if err != nil {
    				return j.CodeStringArrayError, j.MsgStringArrayError, err.Error(), nil
    			}
    		}
    		res = append(res, row)
    	}
    	return j.CodeSuccess, j.MsgSuccess, "", res
    }
    
    //如果某个字段的数据库类型是数组,用这个函数将string转化为[]string
    func stringToStringArray(mp map[string]interface{}, key string) error {
    	val, ok := mp[key].(string)
    	if !ok {
    		return errors.New("value type is not string")
    	}
    	l := len(val)
    	if l <= 2 {
    		mp[key] = make([]string, 0)
    		return nil
    	}
    	mp[key] = strings.Split(val[1:l-1], ",")
    	return nil
    }
    

      

  • 相关阅读:
    lsmod-查看内核模块信息
    centos 7 下通过 conda 安装 cuda pytorch
    python 中文编码
    matplotlib
    How to determine the correct number of epoch during neural network training? 如何确定Epoch
    nvidia-smi Failed to initialize NVML: Driver/library version mismatch
    MySQL MAX函数:查询指定列的最大值
    mysql之group_concat函数详解
    @Param注解的用法解析@Param注解的用法解析
    【MySQL函数】replace()函数
  • 原文地址:https://www.cnblogs.com/cdyboke/p/7163348.html
Copyright © 2011-2022 走看看