mysql使用变量填值为数组_GOLANG:使用SQLX库执行简单的SQL语句

虽然 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 上发布。
好的,关于 Redis 连接池在 Golang 中的使用,我可以给您提供一些相关的类和示例代码。 首先,Golang 中比较常用的 Redis 客户端有以下几个: 1. go-redis/redis 2. go-redis/cache 3. redigo 这三个客户端都支持连接池的使用,下面分别介绍一下它们的连接池使用方法。 1. go-redis/redis go-redis/redis 是 Redis 的 Golang 客户端,它提供了一个叫做 "Options" 的结构体,可以用来设置 Redis 连接池的相关选项,例如最大连接数、闲置连接数等等。 示例代码: ```go import ( "github.com/go-redis/redis" ) func main() { options := &redis.Options{ Addr: "localhost:6379", Password: "", // no password set DB: 0, // use default DB PoolSize: 10, } client := redis.NewClient(options) } ``` 在上面的示例代码中,我们创建了一个 Redis 连接池,最大连接数为 10。 2. go-redis/cache go-redis/cache 是 go-redis/redis 的一个扩展,它提供了一个基于 Redis 的缓存实现。它同样支持 Redis 连接池的使用,可以通过设置 "Options" 结构体中的 "PoolSize" 字段来设置最大连接数。 示例代码: ```go import ( "github.com/go-redis/cache/v8" "github.com/go-redis/redis/v8" ) func main() { options := &redis.Options{ Addr: "localhost:6379", Password: "", // no password set DB: 0, // use default DB PoolSize: 10, } client := redis.NewClient(options) cache := cache.New(&cache.Options{ Redis: client, LocalCache: cache.NewTinyLFU(1000, time.Minute), TTL: time.Hour, }) } ``` 在上面的示例代码中,我们创建了一个 Redis 连接池,最大连接数为 10,并且使用 go-redis/cache 创建了一个基于 Redis 的缓存实现。 3. redigo redigo 是 Redis 的 Golang 客户端,它同样支持 Redis 连接池的使用,可以通过设置 "Pool" 结构体中的 "MaxIdle" 和 "MaxActive" 字段来设置最大空闲连接数和最大活跃连接数。 示例代码: ```go import ( "github.com/gomodule/redigo/redis" ) func main() { pool := &redis.Pool{ Dial: func() (redis.Conn, error) { return redis.Dial("tcp", "localhost:6379") }, MaxIdle: 10, MaxActive: 100, } conn := pool.Get() } ``` 在上面的示例代码中,我们创建了一个 Redis 连接池,最大空闲连接数为 10,最大活跃连接数为 100。 以上就是三个常用的 Golang Redis 客户端的连接池使用方法,您可以根据实际需求选择适合自己的客户端和连接池设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值