[Docker][Golang] 什麼?本地連不到資料庫
[Docker][Golang] 什麼?本地連不到資料庫

[Docker][Golang] 什麼?本地連不到資料庫

菜雞正在使用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"

實作的專案