go-sql-driver包 实现mysql不定字段查询

别人说我名字很长 · · 6366 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

go-sql-driver包是一个第三方包 下载地址http://github.com/go-sql-driver/mysql 下面直接上代码

package main

import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
)

func main() {
	//连接数据库
	db, err := sql.Open("mysql", "root:@tcp(localhost:3306)/go?charset=utf8")
	if err != nil {
		fmt.Println("连接数据库失败", err.Error())
		return
	}
	defer db.Close()

	//查询数据库
	query, err := db.Query("select * from go_user")
	if err != nil {
		fmt.Println("查询数据库失败", err.Error())
		return
	}
	defer query.Close()

	//读出查询出的列字段名
	cols, _ := query.Columns()
	//values是每个列的值,这里获取到byte里
	values := make([][]byte, len(cols))
	//query.Scan的参数,因为每次查询出来的列是不定长的,用len(cols)定住当次查询的长度
	scans := make([]interface{}, len(cols))
	//让每一行数据都填充到[][]byte里面
	for i := range values {
		scans[i] = &values[i]
	}

	//最后得到的map
	results := make(map[int]map[string]string)
	i := 0
	for query.Next() { //循环,让游标往下推
		if err := query.Scan(scans...); err != nil { //query.Scan查询出来的不定长值放到scans[i] = &values[i],也就是每行都放在values里
			fmt.Println(err)
			return
		}

		row := make(map[string]string) //每行数据

		for k, v := range values { //每行数据是放在values里面,现在把它挪到row里
			key := cols[k]
			row[key] = string(v)
		}
		results[i] = row //装入结果集中
		i++
	}

	//查询出来的数组
	for k, v := range results {
		fmt.Println(k, v)
	}

	db.Close() //用完关闭
}



注:原创者是 http://www.du52.com/text.php?id=562  我做了注释,这样容易看懂点


有疑问加站长微信联系(非本文作者)

本文来自:开源中国博客

感谢作者:别人说我名字很长

查看原文:go-sql-driver包 实现mysql不定字段查询

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

6366 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传