刚开始在 sqlx 和 gorm 两者间纠结了半天,准备使用 sqlx 了,看了文档,感觉就是灾难般的文档。
我按照例子硬是没有从 MySQL 读出数据。
又尝试了 gorm,这家伙的文档更加不友好,概念更多。调试了半天,返回的结果 id 永远是 0。我半天没有找到问题。
最终我选择了 database/sql。
http://go-database-sql.org/index.html
参考最友好的一篇使用文档:
https://tutorialedge.net/golang/golang-mysql-tutorial/
测试代码
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/joho/godotenv"
"log"
"os"
)
type KV struct {
id int
key string
value string
updated_at string
}
func main() {
err := godotenv.Load("../.env")
if err != nil {
log.Fatal("Error loading .env file")
}
db_database := os.Getenv("DB_DATABASE")
db_username := os.Getenv("DB_USERNAME")
db_password := os.Getenv("DB_PASSWORD")
db_host := os.Getenv("DB_HOST")
db_port := os.Getenv("DB_PORT")
db, err := sql.Open("mysql",
fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&timeout=5000ms",
db_username, db_password, db_host, db_port, db_database))
if err != nil {
log.Fatal("Error")
}
defer db.Close()
var kv KV
err = db.QueryRow("SELECT id, `key`, value, updated_at FROM kv where id = ?",
2).Scan(&kv.id, &kv.key, &kv.value, &kv.updated_at)
if err != nil {
panic(err.Error())
}
log.Println(kv.id)
log.Println(kv.key)
log.Println(kv.value)
log.Println(kv.updated_at)
}
执行结果:
> go run main.go
2019/10/23 19:29:33 2
2019/10/23 19:29:33 translate_color_name
2019/10/23 19:29:33 4
2019/10/23 19:29:33 2019-09-08 16:31:51
需要注意的地方:
- 定义 struct
- 结果使用 Scan