mysql使用变量填值为数组_GOLANG:使用SQLX库执行简单的SQL语句
发布日期:2021-10-31 18:34:29 浏览次数:23 分类:技术文章

本文共 1848 字,大约阅读时间需要 6 分钟。

虽然 GOLANG 自带 SQL 库 database/sql,但为了简化代码提高编程效率,笔者推荐使用第三方库来处理数据库相关操作。

本文介绍如何使用 SQLX 库连接 MySQL 数据库并执行简单的 SELECT 查询语句。

示例代码来自 nwpc-oper/nmc-typhoon-db-client 项目,从 NMC 台风数据库中检索台风数据,计划用于 CMA-PI 上的业务系统。

安装

连接 MySQL 数据库需要下载数据库驱动 Go-MySQL-Driver

go get -u github.com/go-sql-driver/mysql

下载 SQLX 库

go get github.com/jmoiron/sqlx

在源码中载入上述两个库

import (

创建数据库连接

SQLX 使用的数据库连接地址字符串与 SQLAlchemy 不同,格式如下所示

user:password@tcp(host:port)/database?param1=value1

为了解析时间字段,增加 parseTime=true 参数

var

执行查询

使用 sqlx.DB 对象的 Queryx() 函数执行 SQL 语句,返回值中的 rows 是一个迭代器。

querySQL

处理结果

在标准库 database/sql 中,对每行对象使用 Scan() 方法获取具体的字段值。

该方法需要为每个字段设置一个变量。例如

var (

如果检索结果中字段很多,就可能会导致代码不够简洁。

SQLX 库提供 StructScan() 方法,可以将所有字段放入一个结构体中。

下面首先定义结构体 Record 代表每行数据,再将检索结果全部转为 Record

定义记录结构体

为每个字段都创建对应的成员,可以使用名称为 db 的 struct tag,为字段指定对应的列名。

type

注:上面的代码中使用了自定义的数据类型 DataStringDataFloat64DataInt32 和 NullDateTime,并定义名为 csv 的 struct tag,这都是为了将结果输出到 CSV 格式文件,后面会介绍。

解析检索数据

使用 StructScan 方法根据每行结果填充 Record 对象,将所有结果放到 records 数组中。

records

输出CSV文件

使用 csvutil 库将 Records 对象输出到 CSV 文件中

自定义类型

因为数据库中的部分字段可以为空,所以不能使用内置的格式,而是使用类似 mysql.NullTimesql.NullString 等特殊类型。

csvutil 库在输出 CSV 文件时会调用对象的 MarshalCSV() 方法,上述这些特殊类型都没有定义该方法,所以无法直接使用。

nmc-typhoon-db-client 项目使用自定义类型封装上述类型,并为这些自定义类型创建 MarshalCSV() 方法。这就是上面提到的 DataStringDataFloat64DataInt32 和 NullDateTime 几种类型。

以 DataInt32 为例说明。MarshalCSV() 方法会检测是否为空,只有不为空的情况下才会返回字节数组。

type

另外,这种方式也可以用于自定义日期和时间的序列化。

DateTime 是对 time.Time 的封装,序列化时返回 YYYYMMDDHH 格式的字符串

type

输出

csvutil.Marshal() 函数返回序列化后的字节数组,可以直接写入到文件中。

默认设置下,输出的 CSV 文件使用逗号分隔,并包含表头。

b,

讨论

当前代码还有改进空间,queryColumnsString 字符串由列名字符串数组拼接而成,与 Record 类型的成员变量名称有重复。后续可以考虑使用反射机制,直接从 Record 类型生成 queryColumnsString 字符串。

参考

nwpc-oper/nmc-typhoon-db-client

https://github.com/nwpc-oper/nmc-typhoon-db-client

《SQLAlchemy:执行简单的SQL语句》介绍使用 Python 的 SQLAlchemy 库实现同样的功能。


2f49d19f17f57ed879981890b7948493.png

题图由 Presentsquare Presentsquare 在 Pixabay 上发布。

转载地址:https://blog.csdn.net/weixin_40006779/article/details/110252770 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:重命名找不到该项目_知乎话题:和喜欢的女生聊天找不到话题该怎么办
下一篇:python提取文件指定列_python 提取文件指定列的方法示例

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年03月10日 07时42分00秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

java iso 8601_如何在iOS上获得ISO 8601日期? 2019-04-21
windows8怎么下载python_win8怎么安装python 2019-04-21
linux猜数字程序,用linux实现猜数字小游戏源码 2019-04-21
linux下堆栈溢出实例,堆栈溢出在Linux上沉默? 2019-04-21
python创建nc文件_工具箱第2期 用python玩转NC 2019-04-21
拆分文件_文件拆分与合并 2019-04-21
开发优势_小程序开发优势好处有哪些 2019-04-21
4光影补丁_我的世界seus光影包 2019-04-21
aria手机下载_Aria2App 2019-04-21
汇编指令msr_ARM汇编:MRS和MSR指令 2019-04-21
慕课python第五周测试答案_中国大学MOOC(慕课)_python+_满分章节测试答案 2019-04-21
lsof查看占用高_lsof解决磁盘占用过高,查询却无大文件处理一例! 2019-04-21
python调用oracle过程 权限不足_oracle-存储过程提示 ORA-01031: 权限不足 2019-04-21
java ee6教程_Java EE 极简教程(六):框架的选择 2019-04-21
java io流过滤流_IO流分类详细介绍和各种字节流类介绍与使用 过滤流 字节流 2019-04-21
java预处理指令_Java程序员学C++_1_C++中的预处理命令 | 学步园 2019-04-21
java分词支持拼音_java 支持分词的高性能拼音转换工具,速度是 pinyin4j 的两倍... 2019-04-21
java中的%不对 如何处理_Java心得--异常及其处理 2019-04-21
java 上传速度计算_java常见3种文件上传速度对比和文件上传方法详细代码 2019-04-21
java 中区分月份_输入一年当中的月份,判断是哪个季节.(用java编写并且用到了import java.io.*;)... 2019-04-21