菜雞正在使用Golang前往操作資料庫的路上
第一個錯誤
來個簡單的查詢好了,結果在db連線時就有問題
package database
import (
"database/sql"
"log"
)
var Db *sql.DB
func init() {
var err error
// ref: https://github.com/go-sql-driver/mysql/
Db, err = sql.Open("mysql", "root:root@tcp(127.0.0.1:3306)/blog")
if err != nil {
log.Panicln("err", err.Error())
}
Db.SetMaxIdleConns(20)
Db.SetMaxIdleConns(20)
}
會出現錯誤 sql: unknown driver "mysql" (forgotten import?)
解決方案
在套件引入時,使用_ "github.com/go-sql-driver/mysql"
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
"log"
)
第二個錯誤
mysql與golang在不同的container,在golang的container無法正確連線到DB
docker-compose雖然可以無腦開起作用環境,如下面程式碼
version: "3"
services:
mysql:
container_name: mysql
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_TCP_PORT: 3306
ports:
- '3306:3306'
volumes:
- mysql-data:/var/lib/mysql
environment:
- PMA_HOST=mysql
go:
container_name: app
image: golang:${GO_VERSION}-alpine${ALPINE_VERSION}
ports:
- "8088:8088"
expose:
- 8808
volumes:
- .:/go/src/app
restart: always
cap_add:
- SYS_PTRACE
networks:
- default
tty: true
environment:
GOPROXY: ${GO_PROXY}
TZ: "$TZ"
depends_on:
- mysql
- redis
我在程式碼明明使用本地127.0.0.1:3306
,但卻出現錯誤
sql.Open("mysql", "root:root@tcp(127.0.0.1:3306)/blog")
原因:因為是使用docker去起各服務,golang與mysql的機器在不動的容器內,自然從golang的機器使用127.0.0.1:3306
無法連線到資料庫
解決辦法:使用docker在內部服務的domain或者docker name即可改善
Db, err = sql.Open("mysql", "root:root@tcp(127.0.0.1:3306)/blog") // use 127.0.0.1:3306 when golang is used external docker
Db, err = sql.Open("mysql", "root:root@tcp(mysql:3306)/blog") // use internal docker should use docker name
Db, err = sql.Open("mysql", "root:root@tcp(docker.for.mac.localhost:3306)/blog") // or use mac on internal docker should use "docker.for.mac.localhost"