刚开始在 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