Go初心者です。
勉強のために Echo
GORM
を使ったAPIを作っています。
ただいま usersテーブル に入っているレコードをパラメータで送られたきた id から一つ特定して取得する処理を書いています。 Railsでいう users_contoroller の show
アクションのような処理を作りたいです。
しかし、1回目のGET
では成功するクエリが2回目以降失敗してしまい困っています。(下記で説明)
どなたか解決策をご教授頂けますと幸いですm(_ _)m
ディレクトリ構造は以下のようになります
. |-- controllers | `-- users.go |-- db | `-- connect.go |-- main.go `-- models `-- user.go
各ファイルのは以下のようになっています。
↓ main.go
package main import ( "github.com/labstack/echo" "github.com/labstack/echo/middleware" "echo_first/controllers" ) func main() { e := echo.New() e.Use(middleware.Logger()) e.Use(middleware.Recover()) // ルーティング e.GET("user/:id", users_controller.Show()) // サーバー起動 e.Logger.Fatal(e.Start(":3000")) }
↓ models/user.go
package model type User struct { Id int Name string Birth_day int }
↓ db/connect.go
package dbconnect import ( "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql" "fmt" ) func Connect() *gorm.DB{ db, err := gorm.Open("mysql", "hogeuser:@/hogehoge?charset=utf8&parseTime=True&loc=Local") if err != nil { fmt.Print("データベース接続に失敗しました。") } db.LogMode(true) return db }
↓ conrollers/user.go
package users_controller import ( "github.com/labstack/echo" "net/http" "fmt" "echo_first/models" "echo_first/db" ) func Show() echo.HandlerFunc{ db := dbconnect.Connect() user := new(model.User) return func(c echo.Context) error{ user_id := c.Param("id") result := db.First(&user, "id = ?", user_id) if result.RecordNotFound() { fmt.Println("レコードが見つかりません") } return c.JSON(http.StatusOK, result) } }
サーバーを起動立ち上げ1回目のGETリクエスト user/1
では以下のようにデータを取得できます。
[25.45ms] SELECT * FROM `users` WHERE (id = '1') ORDER BY `users`.`id` ASC LIMIT 1 [1 rows affected or returned ]
しかし2回目のGETリクエスト user/2
ではSQLがおかしく、データを取得できません。
[29.71ms] SELECT * FROM `users` WHERE `users`.`id` = 1 AND ((id = '2')) ORDER BY `users`.`id` ASC LIMIT 1 [0 rows affected or returned ] レコードが見つかりません
データベースのコネクションの問題なのか、GORMのクエリの問題なのか分からず躓いてしまいました。
データベースのコネクションの問題の場合はどこで db.Closeするのか分かりません...。リクエストの度にデータベースに接続して Closeする??のでしょうか。。
どなたかご教授お願い致します( ; ; )
回答1件
あなたの回答
tips
プレビュー