この記事のゴール
VSCodeのDev Containerで構築したGolangとPostgreSQLの開発環境で、DBの接続ができる
WSL2、Dockerのインストール
以下の記事どおり、WSL2とDockerをインストールする。(Docker Desktop不要)
WindowsでもサクサクDocker (Docker on WSL2 without Docker Desktop)
VSCodeのDev Containerで開発環境をセットアップする
VSCodeの拡張機能をインストールする
作業用フォルダを作成し、VSCodeで開く
mkdir go-pg-work
cd go-pg-work
code .
Dev Containerの定義ファイルを作成する。
1.コマンドパレットで「Dev Containers: Add Dev Container Configuration Files」を選択する。

2.「Show All Definitions…」を選択する。

3.「Go & PostgreSQL」を選択する。

4.任意のバージョンを選択する。

5.追加機能のインストールはとりあえず不要でOK。
Golang & PostgreSQLの開発環境を整える
GolangからPostgreSQLへの接続処理を記述する
以下の処理を記述します。
1.main.goファイルを作成する。
touch main.go
2.DBへ接続する。
3.[user]テーブルを作成する。
カラム名 | 型 |
user_id | serial |
user_name | varchar(50) |
4.テーブルに任意のレコードをINSERTする。
user_id | user_name |
1 | 太郎 |
2 | 二郎 |
3 | 三郎 |
5.テーブルに登録したレコードをSELECTする。
以下に該当のコードを記す。
package main
import (
"database/sql"
"fmt"
"log"
"strconv"
_ "github.com/lib/pq"
)
const (
// .devcontainerの.env参照
HOST = "localhost"
DATABASE = "postgres"
USER = "postgres"
PASSWORD = "postgres"
)
type User struct {
Id int `db:"user_id"`
Name string `db:"user_name"`
}
func main() {
var connectionString string = fmt.Sprintf("host=%s user=%s password=%s dbname=%s sslmode=disable", HOST, USER, PASSWORD, DATABASE)
db, err := sql.Open("postgres", connectionString)
if err != nil {
panic(err)
}
_, err = db.Exec("DROP TABLE IF EXISTS users;")
if err != nil {
panic(err)
}
_, err = db.Exec("CREATE TABLE users (user_id serial PRIMARY KEY, user_name VARCHAR(50));")
if err != nil {
panic(err)
}
_, err = db.Exec(`
INSERT INTO
users (user_name)
VALUES
('太郎'),
('二郎'),
('三郎')
`)
if err != nil {
panic(err)
}
rows, err := db.Query("SELECT * FROM users")
if err != nil {
panic(err)
}
defer rows.Close()
var user User
for rows.Next() {
err := rows.Scan(&user.Id, &user.Name)
if err != nil {
log.Fatal(err)
}
fmt.Printf("ID: %s, Name: %s\n", strconv.Itoa(user.Id), user.Name)
}
}
go.modファイルを作成し、importを解決する
上記のコードのままだと、”github.com/lib/pq"
が解決できないので、エラーとなってしまいます。

これを解決するために、go.modファイルを作成します。
1.go.modファイルを作成する
go mod init {カレントディレクトリのパス}
2.以下のコマンドを実行し、Goモジュールをインストールします。
(実行後、go.sumファイルが生成されます)
go mod tidy
ファイルの処理を実行する
1.以下のコマンドを実行し、ファイルの処理を実行します。
go run main.go
2.ターミナルにDBのSELECT結果が表示されれば成功です。
ID: 1, Name: 太郎
ID: 2, Name: 二郎
ID: 3, Name: 三郎
コメント