GoでToDoアプリ作ってる -1-

PublishedAt

2025/8/12

GoでToDoアプリを作り始めました。
メモ程度に残しておきます。

フロントはReact+Viteでやってみました。
と言ってもまだセットアップくらいしかしていない。
あと、フロントは今のところCursorで書いてもらっている。

Goバックエンドはチュートリアルでやった内容とか昨日追記で載せた記事などを参考にして進めています。
まだDBと接続してReadくらいしかできてないけど、今のところ割とGo好きかもと思ってます。

今日やってた中だとまだ解決してないんですが、main.goでDB接続した後にapiサーバを立ち上げる流れにしたいところで、apiのファイルの方でDB接続がうまくいかなかったです。(だいぶ雑な説明…)
ちょっと具体的には以下。インデントおかしかったらすみません

// main.go

func main() {
	database.InitDB()
	api.InitServer()
}
// mysql.go (DB接続)

var dbClient *sql.DB

func InitDB() {
	cfg := mysql.NewConfig()
	cfg.User = "root"
	cfg.Net = "tcp"
	cfg.Addr = "127.0.0.1:3306"
	cfg.DBName = "todo_go_react"

	var err error
	dbClient, err = sql.Open("mysql", cfg.FormatDSN())
	if err != nil {
		log.Fatal(err)
	}

	pingErr := dbClient.Ping()
	if pingErr != nil {
		log.Fatal(err)
	}
	fmt.Println("DB connected.")
}

func GetDB() *sql.DB {
	// memo: mainで接続してもapi.goでそのまま使えず、このチェックを入れている
	if dbClient == nil {
		InitDB()
	}
	return dbClient
}
// api.go

type Task struct {
	ID          int    `json:"id"`
	Title       string `json:"title"`
	IsCompleted bool   `json:"isCompleted"`
}

// memo: mainで接続したやつをそのまま使えない
var dbClient = database.GetDB()

func InitServer() {
	r := gin.Default()

	// [TMP]All Origins Allowed
	r.Use(cors.Default())

	r.GET("/tasks", getTasks)

	r.Run("localhost:8080")
}

func getTasks(context *gin.Context) {
	var tasks []Task

	rows, err := dbClient.Query("SELECT * FROM tasks")
	if err != nil {
		context.IndentedJSON(http.StatusInternalServerError, err)
	}

	defer rows.Close()
	for rows.Next() {
		var task Task
		if err := rows.Scan(&task.ID, &task.Title, &task.IsCompleted); err != nil {
			context.IndentedJSON(http.StatusInternalServerError, err)
		}
		tasks = append(tasks, task)
	}

	if err := rows.Err(); err != nil {
		context.IndentedJSON(http.StatusInternalServerError, err)
	}

	context.IndentedJSON(http.StatusOK, tasks)
}

mainでInitDB一回呼んで済ませて、後はGetDB呼ぶだけにしたいけど、if dbClient == nilの部分が無いとapi.goからGetDB呼んだ時にdbClientがnilになってしまう。

次進めるときはとりあえずこれ解決してから進めないと。


って感じのところまでやってました。

おわり