🪐

PlanetScaleに接続せずローカルへ接続し怒られた【Go】dial tcp 127.0.0.1:3306 ...

2023/08/20に公開

症状

dial tcp 127.0.0.1:3306: connectex: No connection could be made because the target machine actively refused it.

PlanetScaleへ接続するはずがなぜかローカル127.0.0.1:3306へ接続し、エラーになるので沼りかけました。
PlanetScale上でDBを作成し、GoのSampleソース.envを持って疎通確認しようとするとエラーと怒られてしまいました。

https://planetscale.com/

解決策

環境変数DSNを設定定義する
これだけでした。

原因

環境変数を.envファイルに記述していました。
しかし、そのファイル取り込み処理が存在しないので環境変数設定が出来ていませんでした。
ターミナルから設定定義する or ソース上で設定する必要がありました。
今回は前者で対応しました。

環境変数のセット

****************:************@tcp(us-east.connect.psdb.cloud)/products_db?tls=true&interpolateParams=trueは自身で置き換えてください

Bash
DSN="****************:************@tcp(us-east.connect.psdb.cloud)/products_db?tls=true&interpolateParams=true"
PowerShell
env:DSN = "****************:************@tcp(us-east.connect.psdb.cloud)/products_db?tls=true&interpolateParams=true"

以下環境等

環境

  • Windows10(22H2)
  • Go 1.20

ソースプログラム

main.go
package main

import (
	"database/sql"
	"log"
	"os"

	_ "github.com/go-sql-driver/mysql"
)

func main() {
    db, err := sql.Open("mysql", os.Getenv("DSN"))
    if err != nil {
        log.Fatalf("failed to connect: %v", err)
    }
    defer db.Close()

    if err := db.Ping(); err != nil {
        log.Fatalf("failed to ping: %v", err)
    }

    log.Println("Successfully connected to PlanetScale!")
}

.env
DSN=****************:************@tcp(us-east.connect.psdb.cloud)/products_db?tls=true&interpolateParams=true

.envファイルは無くてもいいです。

疎通確認

環境変数を設定しないと以下のようなエラーになります。

1. エラー確認

go run .\main.go
YYYY/MM/DD hh:mm:ss failed to ping: dial tcp 127.0.0.1:3306: connectex: No connection could be made because the target machine actively refused it.
exit status 1

2. 環境変数を設定する。(再出)

****************:************@tcp(us-east.connect.psdb.cloud)/products_db?tls=true&interpolateParams=trueは自身で置き換えてください

Bash
DSN="****************:************@tcp(us-east.connect.psdb.cloud)/products_db?tls=true&interpolateParams=true"
PowerShell
env:DSN = "****************:************@tcp(us-east.connect.psdb.cloud)/products_db?tls=true&interpolateParams=true"

3. 実行&成功

go run main.go
YYYY/MM/DD hh:mm:ss Successfully connected to PlanetScale!

無事に成功しました。
些細な問題ですがエラーメッセージ通りに解釈すると沼りそうです...

余談

Dockerを用いた場合、同様エラーを出している人もいるようです。
https://qiita.com/Keyskey/items/a1baa04d6850cc50727c
https://zenn.dev/yoji/articles/5386d040587f83

リンク

https://planetscale.com/
https://pkg.go.dev/github.com/go-sql-driver/mysql@v1.7.1

Discussion