最近有一个golang的小项目需要接入mysql, 于是我参考了falcon-plus的做法, 引入了gorm, viper, mysql等包, 然而引入的过程并不愉快...过程可以说相当繁琐, 有些语句的写法也比较让人费解, 体验比起Python的mysql-connector是差了一大截🤣. 果然还是人生苦短我用 Python...
途中遇到了几个小坑, 在这里记录一下.
关于viper
viper是一个用于处理读取配置文件的库, 用途很广, 可以对配置文件玩出各种骚操作. 由于我的项目沿用了公司的小框架, 已经是有一个读取配置文件的模块了, 所以一开始并没有对viper相关的部分进行处理. 这样做的后果是, 数据库相关的配置全部都没有读出来, 于是编译运行之后一直在尝试连接localhost:3306
, 而不是配置文件中指定的数据库地址.
仔细看了下代码, 发现这一行(以下代码均近似处理)
db, err := gorm.Open("mysql", viper.GetString("database.addr"))
gorm尝试连接的数据库地址在这里配置, viper会根据GetString
方法的参数, 去配置文件里面找对应的key, 用字符串的形式返回value. 将这个参数改成自己项目配置文件里数据库地址的json key之后, 就可以成功连接数据库了.
关于指针
这个问题完全是由于粗心大意了. 在往数据库插入数据的时候, 出现了using unaddressable value
的报错, 经过排查发现是在该传指针地址的地方传了值, 比如说
pool.testDatabase.Table("test_table").Create(testEntry)
应该写成
pool.testDatabase.Table("test_table").Create(&testEntry)
就对了
关于parseTime
第三个问题是在数据库进行查询的时候遇到的. 表中有一个字段create_time
, 在mysql中的类型是timestamp
, 在go中对应的类型是 *time.Time
. 在导出查询结果的时候, 遇到这样的报错
[2019-08-22 09:07:01]
sql: Scan error on column index 6: unsupported Scan, storing driver.Value type []uint8 into type *time.Time
看起来是驱动读取timestamp
类型的数据时, 直接读取为int8
的格式, 然后在尝试赋值到time.Time
的时候出错了. 在Google后得到解决办法, 很简单, 直接在配置文件中的数据库连接地址最后加上parseTime=true
的配置.
"addr": "test:passwd@tcp(127.0.0.1:3306)/test_database?charset=utf8&loc=Asia%2FChongqing&parseTime=true"
修改之后就可以成功读取时间戳并保存为go中的time.Time
类型了~
其实说起来这几个坑基本上都是因为我没有事先了解这几个包的用途和用法就直接复制粘贴引入而踩到的, 有时候为了省事省时间就偷懒, 实际上会导致花费更多的时间解决bug, 要引以为戒🐶