热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

实现golang将mysql结果集转换成json的通用方法的正确姿势

写在开头最近在做elasticsearch相关的开发,有这么一个需求,需要将mysql指定表的数据导入到elasticsearch的索引中,

写在开头

最近在做elasticsearch相关的开发,有这么一个需求,需要将mysql指定表的数据导入到elasticsearch的索引中,这个需求似乎比较容易,大致思路就是从遍历表中的每一行数据,转换成json,然后通过es的api接口提交到es中。

这个似乎是一个比较简单需求,只是有一点这是一个通用的操作,程序不需要关心遥操作的是什么样的表,包含哪些字段等等。

第一版

stackoverflow上已经有了一个比较好的解决方案:
这里只使用了 go-sql-driver/mysql

func getJSON(sqlString string) (string, error) {rows, err := db.Query(sqlString)if err != nil {return "", err}defer rows.Close()columns, err := rows.Columns()if err != nil {return "", err}count := len(columns)tableData := make([]map[string]interface{}, 0)values := make([]interface{}, count)valuePtrs := make([]interface{}, count)for rows.Next() {for i := 0; i }

代码出自 Dumping MySQL tables to JSON with Golang

第二版

这段代码基本是可以满足需求了,但似乎有一个问题,那就是字段对应的字段的类型并没有保留,全都变成了字符串类型,这里找到了一个比较可行的解决方案:

在这个mysql driver的github里有这么个issue,Returned values are always []byte

That's a specialty of MySQL: you have to use prepared statements to get the native types. MySQL has two protocols, one transmits everything as text, the other as the "real" type. And that binary protocol is only used when you use prepared statements. The driver is pretty much powerless to enforce a protocol and the text protocol takes less resources on the server.

This may help you:

stmt, err := db.Prepare(sqlString)
if err != nil { ...... }
defer stmt.Close()
rows, err := stmt.Query()

这个描述比较清楚了,按照这个逻辑,我把代码修改成了如下形式:

query :&#61; fmt.Sprintf("%s LIMIT %d OFFSET %d", handler.querySQL, limit, offset)stmt, err :&#61; db.Prepare(query)if err !&#61; nil {panic(err.Error())}defer stmt.Close()rows, err :&#61; stmt.Query()if err !&#61; nil {panic(err.Error())}defer rows.Close()columns, err :&#61; rows.Columns()if err !&#61; nil {panic(err.Error())}count :&#61; len(columns)values :&#61; make([]interface{}, count)scanArgs :&#61; make([]interface{}, count)for i :&#61; range values {scanArgs[i] &#61; &values[i]}for rows.Next() {err :&#61; rows.Scan(scanArgs...)if err !&#61; nil {log.Fatalf("Sacn data error: %s", err.Error())continue}entry :&#61; make(map[string]interface{})for i, col :&#61; range columns {v :&#61; values[i]b, ok :&#61; v.([]byte)if ok {entry[col] &#61; string(b)} else {entry[col] &#61; v}}// 序列化数据b, err :&#61; json.Marshal(entry)if err !&#61; nil {log.Fatal(err.Error())continue}handler.docChan <- &document{// 这里取表中的第一个字段计算文档idID: handler.FormatDocumentID(handler.dbName, handler.table, entry[columns[0]]),Data: b,}}

测试来看&#xff0c;似乎只是解决了部分类型问题&#xff0c;整形的数据类型可以被保留下来&#xff0c;但是似乎浮点型字段还是字符串&#xff0c;还在继续探索中。

未完待续.......




推荐阅读
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • mysqldinitializeconsole失败_mysql03误删除了所有用户解决办法
    误删除了所有用户解决办法第一种方法(企业常用)1.将数据库down掉[rootdb03mysql]#etcinit.dmysqldstopShuttingdownMySQL..SU ... [详细]
  • 微信商户扫码支付 java开发 [从零开发]
    这个教程可以用作了解扫码支付的整体运行过程,已经实现了前端扫码,记录订单,回调等一套完整的微信扫码支付。相关链接:微信支 ... [详细]
  • 【CTF 攻略】第三届 SSCTF 全国网络安全大赛—线上赛 Writeup
    【CTF 攻略】第三届 SSCTF 全国网络安全大赛—线上赛 Writeup ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文整理了Java中java.lang.NoSuchMethodError.getMessage()方法的一些代码示例,展示了NoSuchMethodErr ... [详细]
  • 本文整理了Java中org.gwtbootstrap3.client.ui.Icon.addDomHandler()方法的一些代码示例,展示了Icon.ad ... [详细]
  • 本文整理了Java中org.apache.hadoop.hive.ql.plan.ExprNodeColumnDesc.getTypeInfo()方法的一些代码示例,展 ... [详细]
author-avatar
书友56759136
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有